Методы HtmlHelper и RouteValueDictionary - PullRequest
5 голосов
/ 26 марта 2009

При написании расширения htmlhelper, если я хочу поддерживать схожие структурированные ctors для моего метода расширения 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))
}

Ясно, что это ярлык, но это подлость или нормально?

1 Ответ

5 голосов
/ 26 марта 2009

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

Мясо и овощи этого таковы:

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 в

name = "value"

Надеюсь, это имеет смысл.

...