2011-06-22 44 views
6

Tôi đang tạo trình trợ giúp của riêng mình trong MVC. Nhưng các thuộc tính tùy chỉnh không được thêm vào trong HTML:TagBuilder.MergeAttributes không hoạt động

Helper

public static MvcHtmlString MenuItem(this HtmlHelper helper, string linkText, string actionName, string controllerName, object htmlAttributes) 
{ 
    var currentControllerName = (string)helper.ViewContext.RouteData.Values["controller"]; 
    var currentActionName = (string)helper.ViewContext.RouteData.Values["action"]; 

    var builder = new TagBuilder("li"); 

    if (currentControllerName.Equals(controllerName, StringComparison.CurrentCultureIgnoreCase) 
     && currentActionName.Equals(actionName, StringComparison.CurrentCultureIgnoreCase)) 
     builder.AddCssClass("selected"); 

    if (htmlAttributes != null) 
    { 
     var attributes = new RouteValueDictionary(htmlAttributes); 
     builder.MergeAttributes(attributes, false); //DONT WORK!!! 
    } 

    builder.InnerHtml = helper.ActionLink(linkText, actionName, controllerName).ToHtmlString(); 
    return MvcHtmlString.Create(builder.ToString(TagRenderMode.Normal)); 
} 

CSHTML

@Html.MenuItem("nossa igreja2", "Index", "Home", new { @class = "gradient-top" }) 

kết quả cuối cùng (HTML)

<li class="selected"><a href="/">nossa igreja2</a></li> 

Lưu ý rằng nó không thêm lớp gradient-top mà tôi đã đề cập trong cuộc gọi trợ giúp.

Trả lời

18

Khi gọi MergeAttributes với replaceExisting thiết lập để false, nó chỉ bổ sung thêm các thuộc tính hiện không tồn tại trong từ điển các thuộc tính. Nó không hợp nhất/concat các giá trị của các thuộc tính riêng lẻ.

Tôi tin chuyển cuộc gọi của bạn để

builder.AddCssClass("selected"); 

sau

builder.MergeAttributes(attributes, false); 

sẽ khắc phục vấn đề của bạn.

0

tôi đã viết phương pháp mở rộng này mà những gì tôi nghĩ MergeAttributes được nghĩa vụ phải làm (nhưng khi kiểm tra mã nguồn nó chỉ bỏ qua thuộc tính hiện tại):

public static class TagBuilderExtensions 
{ 
    public static void TrueMergeAttributes(this TagBuilder tagBuilder, IDictionary<string, object> attributes) 
    { 
     foreach (var attribute in attributes) 
     { 
      string currentValue; 
      string newValue = attribute.Value.ToString(); 

      if (tagBuilder.Attributes.TryGetValue(attribute.Key, out currentValue)) 
      { 
       newValue = currentValue + " " + newValue; 
      } 

      tagBuilder.Attributes[attribute.Key] = newValue; 
     } 
    } 
}