2009-03-24 11 views
37

मैं अपनी पहली asp.net MVC अनुप्रयोग लिख रहा हूँ "का उपयोग" के साथ सहायक बना सकते हैं और मैं कस्टम HTML सहायकों के बारे में एक प्रश्न है:कस्टम एचटीएमएल सहायकों: बयान समर्थन

एक रूप बना लिए, आप उपयोग कर सकते हैं:

<% using (Html.BeginForm()) {%> 
    *stuff here* 
<% } %> 

मैं कस्टम HTML सहायक के साथ कुछ ऐसा करना चाहता हूं।

में
Html.BeginTr(); 
Html.Td(day.Description); 
Html.EndTr(); 

:

using Html.BeginTr(){ 
    Html.Td(day.Description); 
} 

इस संभव है दूसरे शब्दों में, मैं बदलना चाहते हैं?

उत्तर

47

यहाँ ग # में एक संभव पुन: प्रयोज्य दिया गया है:

class DisposableHelper : IDisposable 
{ 
    private Action end; 

    // When the object is created, write "begin" function 
    public DisposableHelper(Action begin, Action end) 
    { 
     this.end = end; 
     begin(); 
    } 

    // When the object is disposed (end of using block), write "end" function 
    public void Dispose() 
    { 
     end(); 
    } 
} 

public static class DisposableExtensions 
{ 
    public static IDisposable DisposableTr(this HtmlHelper htmlHelper) 
    { 
     return new DisposableHelper(
      () => htmlHelper.BeginTr(), 
      () => htmlHelper.EndTr() 
     ); 
    } 
} 

इस मामले में, BeginTr और EndTr सीधे प्रतिक्रिया स्ट्रीम में लिखें। आप विस्तार तरीकों कि एक स्ट्रिंग लौटाने का उपयोग करते हैं, तो आप का उपयोग कर उन्हें उत्पादन करना होगा:

htmlHelper.ViewContext.HttpContext.Response.Write(s) 
+0

pweh .. और मैंने सोचा कि यह आसान होने के लिए .. आपके प्रयास के लिए धन्यवाद जा रहा था। –

+0

यह सिर्फ एक त्वरित और गंदे कार्यान्वयन था। "प्रारंभ" प्रतिनिधि को सीधे आपकी विस्तार विधि में बुलाया जा सकता है और डिस्पोजेबल हैल्पर क्लास अन्य एक्सटेंशन – ybo

+0

के लिए पुन: प्रयोज्य है धन्यवाद, मैं इसे बाद में बेहतर तरीके से देखूंगा। –

18

आप ASP.NET MVC के लिए स्रोत (Codeplex पर उपलब्ध है) को देखें, तो आप BeginForm के कार्यान्वयन अंततः निम्नलिखित कोड के लिए नीचे कॉल देखेंगे:

static MvcForm FormHelper(this HtmlHelper htmlHelper, string formAction, FormMethod method, IDictionary<string, object> htmlAttributes) 
{ 
    TagBuilder builder = new TagBuilder("form"); 
    builder.MergeAttributes<string, object>(htmlAttributes); 
    builder.MergeAttribute("action", formAction); 
    builder.MergeAttribute("method", HtmlHelper.GetFormMethodString(method), true); 
    htmlHelper.ViewContext.HttpContext.Response.Write(builder.ToString(TagRenderMode.StartTag)); 

    return new MvcForm(htmlHelper.ViewContext.HttpContext.Response); 
} 

MvcForm वर्ग औजार IDISposable, इसकी निपटान विधि में प्रतिक्रिया के लिए </फॉर्म > लिखता है।

तो, आपको जो करना होगा, उसे हेल्पर विधि में टैग करना चाहते हैं और एक ऑब्जेक्ट वापस कर सकते हैं जो IDISposable लागू करता है ... इसमें इसका निपटान विधि टैग बंद कर देती है।

31

मैं MVC3 में यहाँ दी गई सलाह का पालन करने की कोशिश की, लेकिन मैं का उपयोग कर मुसीबत में भाग:

htmlHelper.ViewContext.HttpContext.Response.Write(...); 

जब मैंने इस कोड का उपयोग किया, तो मेरा सहायक मेरे लेआउट को प्रस्तुत करने से पहले प्रतिक्रिया धारा में लिख रहा था। यह अच्छी तरह से काम नहीं किया।

इसके बजाय मैं इस प्रयोग किया है:

htmlHelper.ViewContext.Writer.Write(...); 
+2

धन्यवाद ढेर। मुझे समय के ढेर बचाया। –

+2

मूल कोड का उपयोग कर एमवीसी 3 में मेरे लिए काम किया गया एचटीएमएल बॉडी के नीचे एचटीएमएल सहायक सामग्री लिख रहा था। यह तय है। –

संबंधित मुद्दे