2011-06-22 17 views
40

Jak przekazać obiekt do atrybutów HTML? Na przykład mam następujący kod:Przekazywanie obiektu do atrybutów HTML

var attrs = new { id = "myid", style = "color: Red;" }; 

Jak przekonwertować attrs do łańcucha tak, aby umieścić je w znacznikach HTML:

id="myid" style="color: Red;" 

z góry dzięki :)

+0

Dziękuję Ci pytanie! Uratowałem mój dzień! – Sergey

Odpowiedz

68

Ta funkcjonalność jest dość zaskakująco, dostarczonych przez klasę RouteValueDictionary:

IDictionary<string, object> htmlAttributes = new RouteValueDictionary(attrs); 

Następnie można użyć tego słownika w połączeniu z TagBuilder, która będzie prawdopodobnie używając zresztą:

var tagBuilder = new TagBuilder("input"); 
tagBuilder.MergeAttributes(htmlAttributes); 
tagBuilder.ToString(TagRenderMode.Normal); 

Widać to zrobić w kodzie źródłowym ASP.NET MVC samego; jednym z prostszych przykładów jest TextAreaExtensions.cs.

EDIT:

W celu prawidłowego przeliczenia "data_attr" do "data-attr", należy użyć metody statycznej AnonymousObjectToHtmlAttributes.

IDictionary<string, object> htmlAttributes = HtmlHelper.AnonymousObjectToHtmlAttributes(attrs); 
+2

Po prostu próbuje tego z atrybutem data_bind, a wyjście było data_bind w przeciwieństwie do oczekiwanego, data-bind - jakieś pomysły? – SimonGates

+0

Niestety adres URL do rozszerzenia TextAreaExtensions nie jest już prawidłowy :) Po prostu informuję. – slawek

+0

@slawek dziękuję, naprawiłem z najbliższą rzeczą, którą mogłem znaleźć. – Domenic

21

Robisz nie trzeba konwertować na ciąg znaków. Ostatnim parametrem dla Pomocników HTML jest Obiekt. Wystarczy dać mu przedmiot jak masz napisane powyżej:

Dla exmample

@Html.TextBoxFor(x => x.Foo, new { size = 10, maxlength = 10 }) 
@Html.TextAreaFor(x => x.Notes, new { @class = "additionalInfo" }) 
@Html.TextBoxFor(x=>x.Registration.Address.Postcode, new {type="number", @class="postcode numeric", size=5, maxlength=5}) 

na marginesie to prawdopodobnie nie powinno być ustawienie style directy inline z HTML i użyć klasy CSS/selektor zamiast z oddzielnym arkuszem stylów. także identyfikator każdego elementu DOM powinny być automatycznie ustawione podczas używania pomocników MVC HTML

+1

Wiem, ale dodatkowo chcę napisać własną metodę renderowania innego komponentu formularza, więc potrzebuję sposobu, aby to zrobić, tak jak zrobił to MVC3 :) –

+0

np. Prawdopodobnie powinieneś o tym wspomnieć w swoim pytaniu – Daveo

+0

Dzięki, ja pamiętajcie, że :) –

5

Oto jak to zrobić konwersję:

var htmlAttributes = new { id="myid", @class="myclass" }; 

string string_htmlAttributes = ""; 
foreach (PropertyDescriptor property in TypeDescriptor.GetProperties(htmlAttributes)) 
{ 
    string_htmlAttributes += string.Format("{0}=\"{1}\" ", property.Name.Replace('_', '-'), property.GetValue(htmlAttributes)); 
} 

PropertyDescriptor należą do klasy System.ComponentModel

+2

Nie mam pojęcia, dlaczego nie jest to zalecana odpowiedź. – radpin

+0

kod jest w porządku z ważną zmianą: użyj HttpUtility.HtmlAttributeEncode, aby wyrenderować wartość atrybutu. – Liviu

+0

również konwertować nazwy znaczników x_y w x-y. Tak właśnie działa TagBuilder. – Liviu

Powiązane problemy