asp.net-mvc - ASP.NET MVC 2 - UrlParameter.Optional 条目是否必须位于路由的末尾?

标签 asp.net-mvc asp.net-mvc-routing

我正在将一个站点从 ASP.NET MVC 1 迁移到 ASP.NET MVC 2。目前,该站点支持以下路由:

/{country}/{language}/{controller}/{action}
/{country}/{controller}/{action}
/{language}/{controller}/{action}
/{controller}/{action}
country 的格式和 language可以通过 Regex 区分并且有合适的约束。在 MVC 1 中,我将其中的每一个都注册为一个单独的路由 - 对于大约 20 个组合中的每一个。在 MVC 2 中,我一直在尝试使用 UrlParameter.Optional 使用一条路线来覆盖所有四种情况,从而实现相同的功能。 ,但我似乎无法让它工作 - 如果我定义 countrylanguage两者都可选,那么路由 /Home/Index例如没有成功匹配路线。这就是我想要做的:
routes.MapRoute("Default",
    "{country}/{language}/{controller}/{action}",
    new { country = UrlParameter.Optional, language = UrlParameter.Optional,
        controller = "Home", action = "Index" },
    new { country = COUNTRY_REGEX, language = LANGUAGE_REGEX });

这是不可能的,因为我的选项位于路线的开头,还是我只是遗漏了什么?我找不到任何文件来告诉我我在做什么是不可能的,或者为我指明正确的方向。

最佳答案

唔。有趣的。

这是我能想到的最好的。我猜这是一个坏主意,但这是我能想到的唯一解决方法。我很想听听一些建议/顾虑/投诉。

您可以绘制这样的近视路线:

routes.MapRoute(
    "Localized",
     "{*loc}",
     new { controller = "Localizer", action = "RedirectIt" },
     new { loc = REGEX_CONSTRAINT_FOR_ENTIRE_ROUTE_VALUE }
); 

然后,在您的 Localizer Controller 中,您可以根据需要重定向到正确的操作:
public class LocalizerController : Controller
{
    public ActionResult RedirectIt(string loc)
    {
        //split up the loc string
        //and determine the correct redirect path for the request
    }
}

我是个贪玩便宜的人。我能说什么?

关于asp.net-mvc - ASP.NET MVC 2 - UrlParameter.Optional 条目是否必须位于路由的末尾?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3014773/

相关文章:

c# - MVC C# nameof() 部分添加 @Html.Hidden 未按预期工作

asp.net-mvc - 如何排除某些公共(public)属性被序列化为 JsonResult?

asp.net-mvc-4 - 用于重载操作的 MapRoute

asp.net - HttpHandler 在 ASP.NET MVC3 Web 应用程序中不起作用

c# - 如何仅显示已分配给 c#、mvc 中的 viewbag 的列表中的第一个对象

asp.net-mvc - 添加默认的 SelectListItem

c# - ASP.NET MVC 中的分页和排序网格

asp.net-mvc - 类型 'DefaultInlineConstraintResolver' 的内联约束解析器无法解析以下内联约束 :

asp.net-mvc - 如何在 MVC3 的自定义路由处理程序中指定命名空间?

asp.net-mvc - 未找到 Web Api 路由