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