首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ASP.NET MVC重新映射Catch-All参数值并执行另一个有效路由

ASP.NET MVC重新映射Catch-All参数值并执行另一个有效路由
EN

Stack Overflow用户
提问于 2009-08-20 14:27:16
回答 1查看 820关注 0票数 1

我正在尝试构建灵活的URL路由。

所以url就像这样

代码语言:javascript
复制
en-US/ctrl/act/1/2

应该像这样做

代码语言:javascript
复制
ctrl/act/1/2

并将文化设置为en-US。

现在,我已经通过定义如下两条路由实现了这一点:

代码语言:javascript
复制
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+" }
    );

我有一个基本控制器,它根据输入参数设置区域性。但我想在默认情况下为所有路由提供此功能,所以我尝试了类似这样的功能。

代码语言:javascript
复制
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...

我不确定什么方法才是正确的……

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2009-11-12 21:56:21

最后,我用一个定制的RoutingModule完成了这项工作,如下所示:

代码语言:javascript
复制
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);
}

我在Global.asax的末尾放置了这样一条路由:

代码语言:javascript
复制
routes.MapRoute("RewritingRoute-Culture", "{culture}/{*rewrite}", new { }, new { culture = @"en-US|de-AT" });

因此,如果匹配,它会将值附加到HttpContextBase.Items,然后使用controller etc找到另一个路由并执行该路由。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1306570

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档