2012-05-17 8 views
18

मैंने खोज की लेकिन एक रैपर विधि बनाने के लिए एमवीसी 3 एचटीएमएलहेपर के लिए कोई त्वरित समाधान नहीं मिला।एमवीसी 3 एचटीएमएलहेपर एक्सटेंशन विधि सामग्री के चारों ओर लपेटने के लिए

@html.createLink("caption", "url") 
{ 
    <html> content in tags </html> 
} 

परिणाम

<a href="url" title="Caption"> 
    <html> content in tags </html> 
</a> 

इस के साथ किसी भी मदद की होनी चाहिए: क्या मैं के लिए देख रहा हूँ की तरह कुछ है।

+0

क्या आप पूछ रहे हैं कि ऐसा कुछ करने के लिए संभव है: '@ एचटीएमएल। एक्शनलिंक (" हैलो विश्व "," माईएक्शन ")'? – CallumVass

+0

ऐसा नहीं है। मुझे पता है कि इस तरह के परिदृश्य को संभालने के लिए BeginForm() और EndForm() प्रकार का दृष्टिकोण है, लेकिन यदि आप एक अंत टैग को भूल जाते हैं तो बड़े पैमाने पर ऐसा करने पर कोई समस्या हो सकती है। – Sanj

+0

मुझे यकीन नहीं है कि मुझे पता है कि आपका क्या मतलब है?आप इस परिदृश्य में 'BeginForm' का उपयोग नहीं करेंगे? आप एक फॉर्म बनाने के लिए 'BeginForm' का उपयोग करेंगे, एंकर लिंक नहीं। – CallumVass

उत्तर

42

तरीका है कि इस BeginForm साथ किया जाता है क्या करना होगा है कि वापसी प्रकार MvcForm impliments IDisposable इतनी है कि जब एक using बयान के भीतर इस्तेमाल, की Dispose विधि MvcForm बंद </form> टैग लिखता है।

आप एक विस्तार विधि लिख सकते हैं जो वास्तव में वही काम करता है।

यहां एक है जिसे मैंने अभी प्रदर्शित करने के लिए लिखा है।

पहले, विस्तार विधि:

public static class ExtensionTest 
{ 
    public static MvcAnchor BeginLink(this HtmlHelper htmlHelper) 
    { 
     var tagBuilder = new TagBuilder("a"); 
     htmlHelper.ViewContext.Writer 
         .Write(tagBuilder.ToString(
              TagRenderMode.StartTag)); 
     return new MvcAnchor(htmlHelper.ViewContext); 
    } 
} 

और यहाँ हमारे नए प्रकार है, MvcAnchor:

public class MvcAnchor : IDisposable 
{ 
    private readonly TextWriter _writer; 
    public MvcAnchor(ViewContext viewContext) 
    { 
     _writer = viewContext.Writer; 
    } 

    public void Dispose() 
    { 
     this._writer.Write("</a>"); 
    } 
} 

अपने विचार में आप अब क्या कर सकते हैं:

@{ 
    using (Html.BeginLink()) 
    { 
     @Html.Raw("Hello World") 
    } 
} 

जो परिणाम उत्पन्न करता है:

<a>Hello World</a> 

इस विस्तार से थोड़ा अपने सटीक आवश्यकता से निपटने के लिए:

public static MvcAnchor BeginLink(this HtmlHelper htmlHelper, 
            string href, 
            string title) 
{ 
    var tagBuilder = new TagBuilder("a"); 
    tagBuilder.Attributes.Add("href",href); 
    tagBuilder.Attributes.Add("title", title); 
    htmlHelper.ViewContext.Writer.Write(tagBuilder 
            .ToString(TagRenderMode.StartTag)); 
    return new MvcAnchor(htmlHelper.ViewContext); 
} 

और हमारे विचार:

@{ 
    using (Html.BeginLink("http://stackoverflow.com", "The Worlds Best Q&A site")) 
    { 
     @Html.Raw("StackOverflow - Because we really do care") 
    } 
} 

जो परिणाम पैदावार:

<a href="http://stackoverflow.com" title="The Worlds Best Q&amp;A site"> 
    StackOverflow - Because we really do care</a> 
+2

यह सुंदर है। तुमने मुझे सिर्फ आधा दिन बचाया :)) –

2

इस तरह इसके सरलतम स्तर कुछ कम यह

public static MvcHtmlString SomeLink(this HtmlHelper htmlHelper, string href, string  title, string content) 
    { 
     var urlHelper = ((Controller)htmlHelper.ViewContext.Controller).Url; 
     //var url = urlHelper.Action(actionName, controllerName, routeValues); 

     var someLink = new TagBuilder("a"); 
     someLink.MergeAttribute("href", href); 
     someLink.InnerHtml = content; 

     return new MvcHtmlString(someLink.ToString()); 
    } 
8

वहाँ भी एक और तरीका बताया , डिस्पोजेबल चाल के बिना। यह कम काम करता है, छोटे सहायकों के लिए अच्छा है। मैं इसी तरह सवाल का जवाब दे, और सब कुछ कॉपी नहीं करना चाहते हैं, लेकिन यहां एक छोटी उदाहरण है:

इस सहायक की
@helper Paragraph(string cssClass, Func<object, object> markup) { 
    <p class="@cssClass">@markup.DynamicInvoke(this.ViewContext)</p> 
} 

प्रयोग इस तरह दिखता है:

@Paragraph("highlited", 
    @<text> 
     Look, a @Html.ActionLink("link", "index") 
    </text> 
) 

अन्य इसी तरह के सवाल का मेरे पूरा जवाब here

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