2012-05-17 25 views
18
Aradım

etrafında sarmak için ancak bir sarıcı yöntemini oluşturmak için bir MVC 3 HtmlHelper için herhangi hızlı çözüm bulamadık.MVC 3 htmlhelper uzatma yöntemi içeriği

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

sonuç

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

bununla Herhangi bir yardım olmalıdır: Ne aradığım gibi bir şeydir. Böyle En basit düzeyde bir şey de

+0

böyle bir şey yapmak eğer onun mümkün soruyorsun? – CallumVass

+0

Hayır öyle değil. Böyle bir senaryoyu ele almak için BeginForm() ve EndForm() tür bir yaklaşımın olduğunu biliyorum, ancak bunu büyük bir ölçekte yaptığınızda, bir son etiketi unutursanız bir soruna neden olabilirsiniz. – Sanj

+0

Ne demek istediğimi bildiğimden emin değilim?Bu senaryoda 'BeginForm' kullanılmaz mı? Bir bağlantı oluşturmak için bir bağlantı oluşturmak için 'BeginForm' kullanılır. – CallumVass

cevap

42

yolu yapacağını olduğunu dönüş türü olduğunu MvcForm impliments böylece IDisposable bir using deyimi içinde kullanıldıklarında ait Dispose yöntem MvcForm, </form> etiketini kapatır.

Tam olarak aynı şeyi yapan bir uzantı yöntemi yazabilirsiniz.

İşte bir tane daha göstermeye yazdım.

Öncelikle, uzatma yöntemi:

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); 
    } 
} 

Ve işte yeni tip, MvcAnchor: En görünümlerinde

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

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

şimdi yapabilirsiniz:

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

Hangi sonucu verir:

Bu Genişleyen
<a>Hello World</a> 

hafifçe kesin şartı ile başa çıkmak için:

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); 
} 

ve görüşümüzü: sonucunu verir

@{ 
    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

Bu güzel. az önce beni yarım gün kaydettiniz :)) –

2

bu BeginForm ile yapılır o

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

da bir yolu daha var tek kullanımlık hile olmadan. Daha az iş, küçük yardımcılar için harika. Ben benzer soruya cevap ve her şeyi kopyalamak istemiyorum, ama burada kısa bir örnek:

bu yardımcının
@helper Paragraph(string cssClass, Func<object, object> markup) { 
    <p class="@cssClass">@markup.DynamicInvoke(this.ViewContext)</p> 
} 

Kullanımı şuna benzer:

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

diğer benzer soruya benim tam cevap here. `@ Html.ActionLink (" Merhaba Dünya", "MyAction")`: