2009-03-25 10 views
5

HtmlHelperの拡張を書いて、私は私のHtmlHelperの拡張方法についても同様の構造ctorsをサポートしたい場合は、以下のように、私は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のための理由が必要です。私はあなたがちょうど理由と私が混乱している場所になるかもしれないがわからないが、htmlAttributesIDictionary<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

Rob Coneryの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フレームワークヘルパーの中にすでにあるものに従っていると言っていないからです。 –

+2

Huh。私は別のプロジェクトのためにこれをもう一度探していて、自分の答えを見つけました!何が幸運! –

+0

+1ありがとう、プロジェクトで私を助けました... – xandercoded

関連する問題