2011-06-22 11 views
6

मैं एमवीसी में अपना स्वयं का सहायक बना रहा हूं।टैगबिल्डर। मर्ज एट्रिब्यूट्स काम नहीं करता

हेल्पर

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" }) 

अंतिम परिणाम (एचटीएमएल)

<li class="selected"><a href="/">nossa igreja2</a></li> 
: लेकिन कस्टम विशेषताओं HTML में नहीं जोड़े जाते हैं

ध्यान दें कि इसमें श्रेणी gradient-top नहीं जोड़ा गया है जिसका मैंने सहायक कॉल में उल्लेख किया था।

उत्तर

18

जब MergeAttributesfalse करने के लिए replaceExisting सेट के साथ बुला, यह सिर्फ गुण है कि वर्तमान में गुण शब्दकोश में मौजूद नहीं है कहते हैं। यह व्यक्तिगत विशेषताओं के मूल्यों को विलय/संक्षिप्त नहीं करता है।

मैं के बाद

builder.MergeAttributes(attributes, false); 

builder.AddCssClass("selected"); 

करने के लिए अपने कॉल चलती आपकी समस्या को ठीक कर देंगे विश्वास करते हैं।

0

मैं इस विस्तार विधि लिखा है कि मैं क्या सोचा MergeAttributes करना चाहिए था (लेकिन स्रोत कोड यह सिर्फ मौजूदा विशेषताओं को छोड़ देता है की जाँच पर):

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; 
     } 
    } 
} 
संबंधित मुद्दे