2009-03-25 2 views
5

При написании расширения HtmlHelper, если я хочу, чтобы поддержать так же структурированные ctors для моего метода расширения HtmlHelper, я использую RouteValueDictionary следующим образом:методы HtmlHelper и RouteValueDictionary

public static string ListBoxDict(this HtmlHelper htmlHelper, 
           string name, 
           object value, 
           object htmlAttributes) 
{ 
    return ListBoxDict(htmlHelper, 
         name, 
         value, 
         ((IDictionary<string, object>) 
          new RouteValueDictionary(htmlAttributes))); 
} 

Мой вопрос на самом деле, почему потребность в RouteValueDictionary. .. Я знаю, что вы не можете просто отбросить htmlAttributes до IDictionary<string, object> ... хотя я не уверен, почему и это может быть, где я запутался. Не должно быть RouteValueDictionary связано с маршрутизацией и поэтому не имеет никакого отношения к методам HtmlHelper? Как я уже сказал, я, вероятно, не могу сказать, что буду рад, если кто-нибудь скажет мне, что я пропустил.

Приветствие ...

редактировать: в ответ на ответ Дэ ->

Я только после того, что я видел в использовании в MVC исходного кода для ввода помощников ...

  • см "src\SystemWebMvc\Mvc\Html\InputExtensions.cs"

Это выглядит следующим образом:

public static string TextBox(this HtmlHelper htmlHelper, 
          string name, 
          object value, 
          object htmlAttributes) 
{ 
    return TextBox(htmlHelper, 
        name, 
        value, 
        new RouteValueDictionary(htmlAttributes)) 
} 

Очевидно, что это ярлык, но это укол или это нормально?

ответ

5

Я бы настоятельно рекомендовал посмотреть на blog post Роба Конери о чем-то подобном.

Мясо и овощи из этого заключается в следующем:

Codedump:

public static string ToAttributeList(this object list) 
{ 
    StringBuilder sb = new StringBuilder(); 
    if (list != null) 
    { 
    Hashtable attributeHash = GetPropertyHash(list); 
    string resultFormat = "{0}=\"{1}\" "; 
    foreach (string attribute in attributeHash.Keys) 
    { 
     sb.AppendFormat(resultFormat, attribute.Replace("_", ""), 
      attributeHash[attribute]); 
    } 
    } 
    return sb.ToString(); 
} 

public static string ToAttributeList(this object list, 
            params object[] ignoreList) 
{ 
    Hashtable attributeHash = GetPropertyHash(list); 

    string resultFormat = "{0}=\"{1}\" "; 
    StringBuilder sb = new StringBuilder(); 
    foreach (string attribute in attributeHash.Keys) 
    { 
    if (!ignoreList.Contains(attribute)) 
    { 
     sb.AppendFormat(resultFormat, attribute, 
      attributeHash[attribute]); 
    } 
    } 
    return sb.ToString(); 
} 

public static Hashtable GetPropertyHash(object properties) 
{ 
    Hashtable values = null; 

    if (properties != null) 
    { 
    values = new Hashtable(); 
    PropertyDescriptorCollection props = 
     TypeDescriptor.GetProperties(properties); 

    foreach (PropertyDescriptor prop in props) 
    { 
     values.Add(prop.Name, prop.GetValue(properties)); 
    } 
    } 
    return values; 
} 

Использование:

public static string ListBoxDict(this HtmlHelper htmlHelper, 
           string name, 
           object value, 
           object htmlAttributes) 
{ 
    return htmlHelper.ListBoxDict(name, 
            value, 
            htmlAttributes.ToAttributeList())); 
} 

Что .ToAttributeList() делает это преобразовать объект htmlAttribute в

имени = "значение"

Надеется, что это имеет смысл.

+0

Спасибо, Дэн, это выглядит интересно, и я посмотрю. Я отредактировал свой вопрос, потому что я не сказал, что я слежу за тем, что уже было в помощниках mvc framework. –

+2

Huh. Я искал это снова для другого проекта и нашел свой собственный ответ! Какая удача! –

+0

+1 Спасибо, помог мне в проекте ... – xandercoded

Смежные вопросы