我已经为 HtmlHelper 编写了一个扩展方法(源自活动菜单项 - asp.net mvc3 master page)。这允许我为当前页面输出 cssclass “活动”。
但是,我现在已经重构为使用区域,因此该方法不再有效,因为我在多个区域中有称为 Home 的控制器和称为 Index 的操作。所以我一直试图通过检查当前区域来解决这个问题,其中 Area 作为 routevalues 匿名类型的一部分传递。
所以我的扩展方法现在看起来像这样:
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。
有没有更好的方法来访问匿名类型的属性?