ASP.NET MVC:如何将新项目合并/添加到RouteValueDictionary中

时间:2010-12-27 07:35:09

标签: asp.net-mvc-3 anonymous-types

我将简化我的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)

提前致谢;)

1 个答案:

答案 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!