我将简化我的asp.net mvc项目的路由声明。所以我创建了几种方法来实现这一目标。
context.MapExtendedRoute("Home".MergeWithAreaName(context),
"www".MergeWithAppDomain(),
"123".MergeWithDefaultRouteKeys(),
new {Controller = "Home", Action = "Index"}.MergeWithDefaultRouteValues(),
new {}.MergeWithDefaultRouteConstraints());
前三种方法没有任何问题。但方法4和5返回无效值。 (例如MergeWithDefaultRouteValues)的初始签名是这样的:
public static object MergeWithDefaultRouteValues(this object defaultValues) {
return new RouteValueDictionary(defaultValues) {{"Culture", "SomeValue"}};
}
返回这样的输出(来自RouteDebugger):
Count = 3, Keys = System.Collections.Generic.Dictionary`2+KeyCollection[System.String,System.Object], Values = System.Collections.Generic.Dictionary`2+ValueCollection[System.String,System.Object]
您可以看到没有任何键/值是正确的!任何人都可以告诉我如何弄明白吗?
MapExtendedRoute签名:
MapExtendedRoute(this AreaRegistrationContext context, string name, string domain, string url, object defaults, object constraints)
提前致谢;)
答案 0 :(得分:1)
我通过向MapExtendedRoute方法添加新重载并将签名更改为此来解决了此问题:
MapExtendedRoute(this AreaRegistrationContext context, string name, string domain, string url, RouteValueDictionary defaults, RouteValueDictionary constraints)
问题是将RouteValueDictionary转换为object,然后将对象强制转换为RouteValueDictionary!因此,路径键/值来自第一个RouteValueDictionary属性/值。
var defaultValues = new {};
//this works fine
var x = new RouteValueDictionary(defaultValues) {{"Culture", null}};
//But when x casted to object
var obj = (object)x;
//And obj casted back to RouteValueDictionary
var x2 = new RouteValueDictionary(obj);
//Everything goes to be fail!