6

MVC で独自のヘルパーを作成しています。ただし、カスタム属性は HTML に追加されません。

ヘルパー

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

最終結果 (HTML)

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

gradient-topヘルパー呼び出しで言及したクラスが追加されていないことに注意してください。

4

2 に答える 2

18

set toで呼び出すMergeAttributesと、属性ディクショナリに現在存在しない属性が追加されるだけです。個々の属性の値をマージ/連結しません。replaceExistingfalse

私はあなたの電話をに移動すると信じています

builder.AddCssClass("selected");

builder.MergeAttributes(attributes, false);

あなたの問題を解決します。

于 2011-08-09T22:23:38.000 に答える