RouteValueDictionary встречается как ноль в методе Extension

Используя начальную загрузку, я столкнулся с проблемой установки активного класса для определенных ссылок. Я нашел этот вспомогательный метод в сети и добавил к нему некоторые функциональные возможности. По сути, я хотел добавить к нему элементы RouteValueDictionary и Html. По некоторым причинам мое представление передает нулевой RouteValueDictionary вместо значений, которые я заполняю.

Я думаю, что моя проблема в том, что я что-то упускаю на стороне представления, HTML-код может фактически не выдавать значение маршрута так, как должно.

Метод расширения:

public static MvcHtmlString MenuLink(this HtmlHelper pHtmlHelper, string pLinkText, string pActionName, string pControllerName, RouteValueDictionary pRouteValues)
{
    var vCurrentAction = pHtmlHelper.ViewContext.RouteData.GetRequiredString("action");
    var vCurrentController = pHtmlHelper.ViewContext.RouteData.GetRequiredString("controller");
    var vBuilder = new TagBuilder("li") { InnerHtml = pHtmlHelper.ActionLink(pLinkText, pActionName, pControllerName, pRouteValues, null).ToHtmlString() };

    if (pControllerName == vCurrentController && pActionName == vCurrentAction) vBuilder.AddCssClass("active");

    return new MvcHtmlString(vBuilder.ToString());
}

Вид (часть):

@Html.MenuLink("Account", "Details", "Dashboard", new RouteValueDictionary(new {id="Account"}))

Визуализированный HTML:

<a href="/Dashboard/Details/Account">Account</a>

Итак, еще раз, проблема у меня заключается в том, что MenuLink получает нулевой RouteValueDictionary, я чувствую, что он должен содержать идентификатор!

(Примечание... pHtmlHelper.ViewContext.RouteData на самом деле содержит тег id в своих значениях RouteData....)

1 ответ

Ваш код работает, как и ожидалось, при условии, что у вас есть маршрут, который выглядит (в зависимости от порядка маршрутов):

routes.MapRoute(
    "Default", // Route name
    "{controller}/{action}/{id}", // URL with parameters*
    new { controller = "Home", action = "Index", 
    id = UrlParameter.Optional }
);

Итак, код:

 pHtmlHelper.ActionLink(
   pLinkText,       // Link Text 
   pActionName,     // Action
   pControllerName, // Controller
   pRouteValues,    // Route Values
   null)
   .ToHtmlString() };

URL будет

/Dashboard/Details/{id}

Значения маршрута:

 {
   id="Account"
 }

будет выглядеть так:

/Dashboard/Details/Account
Другие вопросы по тегам