我已经为HtmlHelper(从active menu item - asp.net mvc3 master page派生)编写了扩展方法。这使我可以为当前页面输出cssclass“active”。
但是,现在我已经重构为使用Areas,因此该方法不再起作用,因为在多个区域中都有名为Home的控制器和称为Index的动作。因此,我一直在尝试通过检查当前区域以及作为Routevalues匿名类型的一部分传递的Area来解决此问题。
所以我的扩展方法现在看起来像这样:
public static MvcHtmlString NavigationLink<T>(this HtmlHelper<T> htmlHelper, string linkText, string actionName, string controllerName, dynamic routeValues)
{
string currentController = htmlHelper.ViewContext.RouteData.GetRequiredString("controller");
string currentArea = htmlHelper.ViewContext.RouteData.DataTokens["Area"] as string;
if (controllerName == currentController && IsInCurrentArea(routeValues,currentArea))
{
return htmlHelper.ActionLink(
linkText,
actionName,
controllerName,
(object)routeValues,
new
{
@class = "active"
});
}
return htmlHelper.ActionLink(linkText, actionName, controllerName, (object)routeValues, null);
}
private static bool IsInCurrentArea(dynamic routeValues, string currentArea)
{
string area = routeValues.Area; //This line throws a RuntimeBinderException
return string.IsNullOrEmpty(currentArea) && (routeValues == null || area == currentArea);
}
我将routeValues的类型更改为动态,以便可以编译以下行:
字符串区域= routeValues.Area;
我可以在调试器中的routeValues对象上看到Area属性,但是一旦访问它,我就会得到RuntimeBinderException。
有没有更好的方法来访问匿名类型的属性?
最佳答案
我发现可以在RouteValueDictionary上使用构造函数,这使我可以轻松查找Area
属性。
我还注意到我也尝试通过使用控制器值来使问题复杂化,因此我的代码现在如下所示:
public static MvcHtmlString NavigationLink<T>(this HtmlHelper<T> htmlHelper, string linkText, string actionName, string controllerName, object routeValues)
{
string currentArea = htmlHelper.ViewContext.RouteData.DataTokens["Area"] as string;
if (IsInCurrentArea(routeValues, currentArea))
{
return htmlHelper.ActionLink(
linkText,
actionName,
controllerName,
routeValues,
new
{
@class = "active"
});
}
return htmlHelper.ActionLink(linkText, actionName, controllerName, routeValues, null);
}
private static bool IsInCurrentArea(object routeValues, string currentArea)
{
if (routeValues == null)
return true;
var rvd = new RouteValueDictionary(routeValues);
string area = rvd["Area"] as string ?? rvd["area"] as string;
return area == currentArea;
}
关于asp.net-mvc-3 - ASP.NET MVC3:如何在HtmlHelper扩展方法中访问作为routeValues匿名类型传递的参数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5008927/