2009-08-20 11 views
1

私は柔軟なURLルーティングを構築しようとしています。ASP.NET MVCリマップキャッチ - すべてのパラメータ値と別の有効なルートを実行

ので

en-US/ctrl/act/1/2 

のようなURLは

ctrl/act/1/2 

と同じことを行うと、EN-USの文化を設定する必要があります。

routes.MapRoute(
    "Ctrl", 
    "ctrl/{action}/{group}/{page}", 
    new { controller = "Home", action = "Index", group = 1, page = 1 }, 
    new { group = @"\d+", page = @"\d+" } 
    ); 

routes.MapRoute("CtrlWithCulture", 
    "{culture}/ctrl/{action}/{group}/{page}", 
    new { culture = "", controller = "Home", action = "Index", group = 1, page = 1 }, 
    new { culture = "[a-z]{2}-(?:[a-zA-Z]{2,4}-)*(?:[a-zA-Z]{2,4})", group = @"\d+", page = @"\d+" } 
    ); 

Iは、入力パラメータに基づいて培養を設定しているベースコントローラを有する:

は、今は、次のように2つのルートを定義することによって、その達成しました。 しかし、私はこの機能をデフォルトですべてのルートで使いたいので、このようなことを試しました。私はこれに適切なアプローチがどうなるかわからない

Global.asax.cs: 

routes.MapRoute("RootWithCulture", 
    "{culture}/{*rest}", 
    new { controller = "Home", action = "Index", culture = "" }, 
    new { culture = "[a-z]{2}-(?:[a-zA-Z]{2,4}-)*(?:[a-zA-Z]{2,4})" } 
    ); 

MyController.cs 

public class MyController : Controller 
{ 
... 
    protected override void OnActionExecuting(ActionExecutingContext context) 
    { 
     if (!String.IsNullOrEmpty(context.RouteData.Values["culture"].ToStringOrNull())) 
     { 
      this.SetCulture(String.IsNullOrEmpty(context.RouteData.Values["culture"]) 
      context.RouteData.Values.Remove("culture"); 
      // I'm stuck here! 
      // I want to try other routes and find and execute the right one... 

...私はこのようになりますカスタムRoutingModuleでそれをやった最後に

答えて

1

public class RewritingRoutingModule : UrlRoutingModule 
{ 
protected string routeNameToRewrite = "rewrite"; 
public override void PostResolveRequestCache(HttpContextBase context) 
{ 
RouteData routeData = this.RouteCollection.GetRouteData(context); 
if (routeData != null) 
{ 
    if (routeData.Values.ContainsKey(routeNameToRewrite)) 
    { 
    // take all route parameters before *rewrite 
    IEnumerable<KeyValuePair<string, object>> additionalData = routeData.Values.TakeWhile(item => item.Key != routeNameToRewrite); 
    // put route parameter names and values into HttpContextBase.Item collection 
    foreach (KeyValuePair<string, object> item in additionalData) 
    context.Items.Add(item.Key, item.Value); 
    // rewrite the route with *rewrite part only 
    context.RewritePath("~/" + (routeData.Values[routeNameToRewrite] != null ? routeData.Values[routeNameToRewrite].ToString() : "")); 
    } 
} 
base.PostResolveRequestCache(context); 
} 

I Global.asaxの中に最後に、このようなルートを置い:

routes.MapRoute("RewritingRoute-Culture", "{culture}/{*rewrite}", new { }, new { culture = @"en-US|de-AT" }); 

これが一致したのであれば、それはに値を追加しますを開き、コントローラなどで別のルートを見つけて実行してください。

関連する問題