2010-12-27 18 views
0

私のasp.net mvcプロジェクトのルート宣言を簡略化します。だから私はこれを行ういくつかの方法を作成しました。ASP.NET MVC:RouteValueDictionaryに新しい項目をマージ/追加する方法

context.MapExtendedRoute("Home".MergeWithAreaName(context), 
           "www".MergeWithAppDomain(), 
           "123".MergeWithDefaultRouteKeys(), 
           new {Controller = "Home", Action = "Index"}.MergeWithDefaultRouteValues(), 
           new {}.MergeWithDefaultRouteConstraints()); 

最初の3つの方法で問題はありません。しかし、方法4と5は無効な値を返します。

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] 

あなたはキー/値のどれを見ることはできませんが正しい(例えばMergeWithDefaultRouteValues)の最初の署名は、このようなものです!誰かが私にそれを理解する方法を教えてもらえますか?

MapExtendedRouteの署名:事前に

MapExtendedRoute(this AreaRegistrationContext context, string name, string domain, string url, object defaults, object constraints) 

感謝;)

答えて

1

私はMapExtendedRouteメソッドに新しいオーバーロードを追加することによってこの問題を解決し、これに署名を変更します。問題を

MapExtendedRoute(this AreaRegistrationContext context, string name, string domain, string url, RouteValueDictionary defaults, RouteValueDictionary constraints) 

RouteValueDictionaryをオブジェクトにキャストしてから、オブジェクトを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! 
関連する問題