2009-08-22 8 views
23

W asp.net mvc zawsze widzę wbudowanych pomocników html, którzy zawsze mają obiekt htmlAttirbutes.Jak uzyskać wartości poza obiektem HtmlAttributes

Potem zwykle robię nowy {@id = "test", @ class = "myClass"}.

Jak wyodrębnić parametr podobny do tego w moich własnych pomocników html?

Podobnie jak używam "HtmlTextWriterTag", jest to sposób, w jaki mogę przekazać cały ten obiekt autorowi, a on to rozgrywał lub co?

Również w jaki sposób działa to z dużymi pomocnikami HTML?

Podobnie jak robię helper html i używa wszystkich tych tagów.

Table 
thead 
tfooter 
tbody 
tr 
td 
a 
img 

Czy to oznacza, że ​​muszę utworzyć atrybut html dla każdego z tych tagów?

Odpowiedz

36

zwykle zrobić coś takiego:

public static string Label(this HtmlHelper htmlHelper, string forName, string labelText, object htmlAttributes) 
    { 
     return Label(htmlHelper, forName, labelText, new RouteValueDictionary(htmlAttributes)); 
    } 

    public static string Label(this HtmlHelper htmlHelper, string forName, string labelText, 
           IDictionary<string, object> htmlAttributes) 
    { 
     // Get the id 
     if (htmlAttributes.ContainsKey("Id")) 
     { 
      string id = htmlAttributes["Id"] as string; 
     } 

     TagBuilder tagBuilder = new TagBuilder("label"); 
     tagBuilder.MergeAttributes(htmlAttributes); 
     tagBuilder.MergeAttribute("for", forName, true); 
     tagBuilder.SetInnerText(labelText); 
     return tagBuilder.ToString(); 
    } 

Proponuję, aby pobrać źródła ASP.NET MVC z CodePlex i przyjrzeć wbudowanego pomocników html.

+0

okazuje się, że Twój przykład jest bardziej pouczający niż źródło. nie mogłem zrozumieć, jak działa źródło, ponieważ oczekiwano IDictionary (jak twoja etykieta), ale próbowałem przekazać to anonimowy obiekt. Kiedy zobaczyłem, że przekonwertowałeś go na RouteValueDictionary, ma to więcej sensu. –

+2

Nie działa to z atrybutami typu data_bind – SimonGates

3

można przekształcić htmlAttirbutes obiektów do reprezentacji atrybut/wartość ciągu tak:

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

1

używam kombinacji obu metod (Chtiwi Malek i rrejc) Proponowane wcześniej i działa świetnie.

Za pomocą tej metody zostanie przekonwertowany data_id na data-id. Nadpisze również domyślne wartości atrybutów ustawione wcześniej.

Uwaga na komentarz o nadpisaniu atrybutu, który ma domyślną wartość w kodzie w foreach.

Powiązane problemy