2009-10-26 16 views
16

ASP.NET MVC'de HTML bağlantılarının bir listesini oluşturmak istiyorum. Bağlantıların tasarlandığı web sitesine mutlak ve harici olduğunu unutmayın.Asp.Net MVC döngüsünde düz HTML bağlantıları nasıl oluşturulur?

<% foreach (var item in Model) { %> 

    <tr> 
     <td> 
      <%= Html.Encode(item.Id) %> 
     </td> 
     <td> 
      <%= String.Format("<a href=\"{0}\">link</a>", item.Url) %> 
     </td> 
    </tr> 

<% } %> 

Ama gerçekten doğru bir yaklaşım olmadığını merak ediyorum: Aşağıdaki kod çalışır. Burada bariz MVC kontrolünü kaçırıyor muyum?

cevap

15

HtmlHelper üzerinde genişletici yöntemi oluşturmaktır:

public static class HtmlHelpers 
    { 

     public static string SimpleLink(this HtmlHelper html, string url, string text) 
     { 
      return String.Format("<a href=\"{0}\">{1}</a>", url, text); 
     } 

    } 

o zaman bu gibi kullanabilirsiniz:

<tr> 
     <td> 
      <%= Html.Encode(item.Id) %> 
     </td> 
     <td> 
      <%= Html.SimpleLink(item.Url,item.Text) %> 
     </td> 
    </tr> 

[değiştir] ben eklemek unuttum. uygulama boyunca bu HtmlHelper uzatma kullanmak için web yapılandırma dosyasında aşağıdaki eklemeniz gerekir:

<system.web> 
     <pages> 
     <namespaces> 
      <!-- leave rest as-is --> 
      <add namespace="theNamespaceWhereHtmlHelpersClassIs"/> 
     </namespaces> 
     </pages> 
    </system.web> 
+3

Bu, hem URL'de hem de metinlerde HTML enjeksiyonuna izin verir. TagBuilder kullanın ya da en azından URL kodlamak ve html metni kodlamak için öznitelik unutmayın. – DamienG

+0

Gerçekten de DamienG, tnx. –

+0

Bu yardımcı oldu. Ayrıca bu [weblog] (http://weblogs.asp.net/jgalloway/archive/2011/03/23/comparing-mvc-3-helpers-using-extension-methods-and-declarative-razor-helper. aspx) aynı şeyi açıklayan ancak Razor sözdizimini kullanan ve bundan yeniden kullanılabilir bir kitaplık oluşturmayı gösteren makale. – nwayve

2

Sanırım bu iyi. Basit bir foreach MVC'deki repeater rolünü yapar.

3

doğrusu

<td><a href="<%= item.Url %>">link</a></td> 

bana biraz "daha temiz" görünüyor kullanmak istiyorsunuz, ama yaklaşımınız kadar iyi olduğunu düşünüyorum. İyi bir yaklaşımla ama hiçbir şey eksik değil

26

Ben tag oluşturucu sınıfını kullanarak, o MVC framework yapar yöntemi uygulayan ister. Ben htmlAttributes parametre geçebilir Bu şekilde sınıf veya diğer özellikler gibi şeyler eklemek için:

public static MvcHtmlString HtmlLink(this HtmlHelper html, string url, string text, object htmlAttributes) 
{ 
TagBuilder tb = new TagBuilder("a"); 
tb.InnerHtml = text; 
tb.MergeAttributes(new RouteValueDictionary(htmlAttributes)); 
tb.MergeAttribute("href", url); 
return MvcHtmlString.Create(tb.ToString(TagRenderMode.Normal)); 
} 

sadece bir bağlantı oluşturmak için overkill gibi görünebilir, ancak bu dize biçimi desenleri ile ilgili muck gerek yok demektir

3

adresindeki ek HTML özniteliklerini eklemek için Orchard projesinde bir bağlantı oluşturucu yöntemine sahip bir HtmlHelper uzantı sınıfı vardır.

bakınız: HtmlHelperExtensions.Link()

http://orchard.codeplex.com/SourceControl/changeset/view/dbec3d05e6d1#src%2fOrchard%2fMvc%2fHtml%2fHtmlHelperExtensions.cs

aşağıdaki kullanımını sağlar: Yukarıdaki bağlantı geçersiz artık

<li>@Html.Link(Model.Path, Model.Title)</li> 

Güncelleme, ancak kaynak indirirseniz, Linkler için 5 aşırı yüklenme içeren HtmlHelperExtensions bulacaksınız, bunlardan biri şu şekilde görünür:

public static IHtmlString Link(this HtmlHelper htmlHelper, string linkContents, string href, IDictionary<string, object> htmlAttributes) { 
     var tagBuilder = new TagBuilder("a") { InnerHtml = htmlHelper.Encode(linkContents) }; 
     tagBuilder.MergeAttributes(htmlAttributes); 
     tagBuilder.MergeAttribute("href", href); 
     return new HtmlString(tagBuilder.ToString(TagRenderMode.Normal)); 
    } 
1

Html kodlamasını önlemek için @ Html.Raw (url) kullanın.