2009-03-25 22 views
5

Khi viết một phần mở rộng HtmlHelper nếu tôi muốn hỗ trợ các ctors có cấu trúc tương tự cho phương pháp mở rộng HtmlHelper tôi, tôi sử dụng RouteValueDictionary như sau:phương pháp HtmlHelper và 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))); 
} 

Câu hỏi của tôi thực sự là lý do tại sao nhu cầu RouteValueDictionary. .. Tôi biết bạn không thể chỉ cần đúc htmlAttributes đến IDictionary<string, object> ... mặc dù tôi không chắc chắn lý do tại sao và đó có thể là nơi tôi đang bối rối. Không nên RouteValueDictionary phải làm với Định tuyến và do đó không có gì để làm với các phương pháp HtmlHelper? Như tôi đã nói, có lẽ tôi đang thiếu điểm nên tôi rất vui nếu ai đó có thể cho tôi biết những gì tôi đã bỏ lỡ.

Cheers ...

chỉnh sửa: để đáp ứng với câu trả lời của Dan ->

Tôi chỉ sau những gì tôi đã thấy trong sử dụng trong mã nguồn MVC cho những người giúp đỡ đầu vào ...

  • xem "src\SystemWebMvc\Mvc\Html\InputExtensions.cs"

Nó như sau:

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

Rõ ràng là một lối tắt nhưng có phải là sự khốn khổ hay không?

Trả lời

5

Tôi thực sự khuyên bạn nên xem Rob Conery's blog post về nội dung như thế này.

Thịt và rau của nó là thế này:

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; 
} 

Cách sử dụng:

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

.ToAttributeList() nào là chuyển đổi đối tượng htmlAttribute của bạn để

name = "giá trị"

Hy vọng điều này có ý nghĩa.

+0

Cảm ơn Dan, có vẻ thú vị và tôi sẽ xem xét. Tôi đã chỉnh sửa câu hỏi của mình vì tôi đã không nói rằng tôi đã theo dõi những gì đã có sẵn trong những người giúp đỡ khung mvc –

+2

Huh. Tôi đang tìm kiếm điều này một lần nữa cho một dự án khác và tìm thấy câu trả lời của riêng tôi! Thật may mắn! –

+0

+1 Cảm ơn, đã giúp tôi thực hiện dự án ... – xandercoded