2009-03-25 14 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 के लिए की जरूरत। .. मुझे पता है कि आप 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())); 
} 

करने के लिए अपने htmlAttribute वस्तु कन्वर्ट क्या .ToAttributeList() है करता है

नाम = "मूल्य"

आशा इस समझ में आता है।

+0

धन्यवाद दान, जो दिलचस्प लग रहा है और मैं एक नज़र डालेगा। मैंने अपना प्रश्न संपादित कर लिया है क्योंकि मैंने यह नहीं कहा था कि मैं एमवीसी फ्रेमवर्क हेल्पर्स –

+2

हू में पहले से ही जो कुछ भी कर रहा था उसका पालन कर रहा था। मैं इसे एक और परियोजना के लिए फिर से ढूंढ रहा था और मेरा अपना जवाब मिला! क्या किस्मत! –

+0

+1 धन्यवाद, मुझे एक परियोजना पर मदद की ... – xandercoded

संबंधित मुद्दे