MvcHtmlString nedir ve ne zaman kullanmalıyım?


221

Dokümantasyon için MvcHtmlStringkorkunç aydınlatarak değildir:

Tekrar kodlanmaması gereken HTML kodlu bir dizeyi temsil eder.

Bunun ne anlama geldiğini tam olarak bilmiyorum. Bazı HTML yardımcı yöntemlerinin bir döndürdüğü anlaşılıyor MvcHtmlString, ancak özel yardımcıların çevrimiçi olarak gördüğüm birkaç örnek sadece normal bir dize döndürüyor.

Sorular:

Nedir MvcHtmlString?

Ne zaman seçmeliyim MvcHtmlStringüzerinde stringtersi ve yardımcısı? Neden?

Yanıtlar:


246

ASP.NET 4 yeni bir kod külçe sözdizimi sunar <%: %>. Esasen, <%: foo %>çevirir <%= HttpUtility.HtmlEncode(foo) %>. Ekip, XSS'yi önlemek için geliştiricileri mümkün <%: %>olan <%= %>her yerde kullanmak yerine kullanmaya çalışıyor .

Ancak, bu, bir kod külçesi zaten sonucunu kodlarsa <%: %>sözdiziminin onu yeniden kodlaması sorununu ortaya çıkarır . Bu, IHtmlString arabiriminin (.NET 4'te yeni) tanıtılmasıyla çözülmüştür. Eğer foo () içinde <%: foo() %>dönüşleri bir IHtmlString, <%: %>sözdizimi bunu yeniden kodlamaya olmayacaktır.

MVC 2 yardımcıları ASP.NET 4 üzerinde IHtmlString arabirimini uygulayan MvcHtmlString döndürür. Bu nedenle geliştiriciler <%: Html.*() %>ASP.NET 4'te kullandıklarında , sonuç çift olarak kodlanmaz.

Düzenle:

Bu yeni sözdiziminin hemen yararı, görüşlerinizin biraz daha temiz olmasıdır. Örneğin, <%: ViewData["anything"] %>yerine yazabilirsiniz <%= Html.Encode(ViewData["anything"]) %>.


Ben MVC 2, 4 değil. Net 3.5 karşı derlenmiş olduğunu eklemek istiyorum. Bu sadece 4'te mevcut olduğu için MvcHtmlStringgeçerli değildir anlamına gelir IHtmlString. <%:Sözdizimi ördek türü gerekir - arayüz ne olursa olsun her zaman .ToHtmlString()önce çağırır .ToString().
Keith

2
Düzeltilmiş duruyorum - aslında MvcHtmlString.Createyöntem IHtmlStringkullanılabilir olup olmadığını algılar ve eğer döndürülürse dinamik olarak döndürülen sınıfı oluşturur: windowsitpro.com/article/net-framework/Encoding-and-Strings/…
Keith

Takip: MvcHtmlString ve HtmlString arasında anlamlı bir fark var mı? Yukarıda bağlantılı belgeleri okuduktan sonra hala HtmlString'in vermediği MvcHtmlString'in bana ne verdiğini bilmiyordum.
flipdoubt

@flipdoubt - Anlamlı bir fark yok.
Levi

2
İkisi arasında çok küçük bir fark vardır. MvcHtmlString, boş bir dize iletirseniz ToString () veya ToHtmlString () içinde String.Empty döndürür. HtmlString null değerini döndürmeye devam edecektir.
rossisdead

87

Bu geç bir cevaptır, ancak bu soruyu okuyan biri jilet kullanıyorsa, hatırlamanız gereken şey, jiletin varsayılan olarak her şeyi kodlamasıdır, ancak MvcHtmlStringhtml yardımcılarınızda jilete kodlaması gerekmediğini söyleyebilirsiniz .

Jiletin bir dize kullanımını kodlamamasını istiyorsanız

@Html.Raw("<span>hi</span>")

Decompiling Raw (), dizeyi bir HtmlString öğesine kaydırdığını gösterir

public IHtmlString Raw(string value) {
    return new HtmlString(value); 
}

" HtmlString yalnızca ASP.NET 4'te bulunur.

MvcHtmlString, hem .NET 3.5 hem de .NET 4'ü desteklemek için MVC 2'ye eklenen bir uyumluluk şimiydi. Şimdi MVC 3 yalnızca .NET 4 olduğuna göre, kaynak uyumluluğu için MVC 2> 3 için muhtemelen önemsiz bir alt sınıftır. " kaynak


11

Kendi HtmlHelperuzantılarınızı yapmak istiyorsanız, bunun güzel bir pratik kullanımı . Örneğin, <link>etiket sözdizimini hatırlamaktan nefret ediyorum , bu yüzden bir <link>etiket yapmak için kendi uzantı yöntemimi oluşturdum :

<Extension()> _
Public Function CssBlock(ByVal html As HtmlHelper, ByVal src As String, ByVal Optional ByVal htmlAttributes As Object = Nothing) As MvcHtmlString
    Dim tag = New TagBuilder("link")
    tag.MergeAttribute("type", "text/css")
    tag.MergeAttribute("rel", "stylesheet")
    tag.MergeAttribute("href", src)
    tag.MergeAttributes(New RouteValueDictionary(htmlAttributes))
    Dim result = tag.ToString(TagRenderMode.Normal)
    Return MvcHtmlString.Create(result)
End Function

StringBu yöntemden döndü , ama eğer ben olsaydı aşağıdakileri kırmak olacaktır:

<%: Html.CssBlock(Url.Content("~/sytles/mysite.css")) %>

İle MvcHtmlString, <%: ... %>veya birini kullanarak her <%= ... %>ikisi de doğru çalışır.


7

Bir kullanmak istiyorsunuz MvcHtmlStringBir MVC yardımcı yöntemine ham HTML geçirmek istiyorsanız ve yardımcı yöntem HTML kodlamak için istemiyoruz.


Hmm ... Bir HTML yardımcı yönteminin bütününün HTML kodlamak olduğunu düşündüm. Başka bir HTML yardımcı yöntemiyle ne yapardım?
devuxer

Ve bunun yanı sıra, ne zaman isteyeyim dönmek bir MvcHtmlStringHTML yardımcı yönteminden?
devuxer

Geçiş veya dönüş. HTML yardımcınız önceden kaçan HTML oluşturuyorsa ve başkasının tekrar kaçmasını istemiyorsanız bir tanesini döndürmek istersiniz.
SLaks

1
Tamam, sanırım bu beni biraz daha yaklaştırıyor, ancak (akıllı bir eşek olarak karşılaşma riski altında) Başkasının yeniden kaçmasını isteyip istemediğime nasıl karar verebilirim? Birisine kaçan html ile uğraşma yeteneği vermek genellikle iyi / kötü bir uygulama mıdır? Daha önce hiç böyle bir yapı görmemiştim. "Bu bir ip gibi ama lütfen ona dokunmayın ... ona dokunmanızı engelleyen bir şey olmadığı için değil, tercih etmemenizi tercih ederiz." Bu ne hakkında?
devuxer

1
Mesele şu ki, normal bir dizgiden farklı olarak, bu dize zaten kodlanmıştır. Bu nedenle, dokunmaya gerek yoktur.
SLaks
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.