ASP.NET MVC使用长URL路由配置和国际化

时间:2015-08-07 08:12:41

标签: asp.net-mvc model-view-controller routes internationalization asp.net-mvc-routing

我正在与国际化和漫长的路线合作。 我的网址看起来像 domain / en-us / users / edit / 240

这是我的RouteConfig:

      routes.MapRoute(
            name: "DefaultWithCulture",
            url: "{culture}/{controller}/{action}/{id}",
            defaults: new { culture = CultureHelper.GetDefaultCulture(), controller = "Home", action = "Index", id = UrlParameter.Optional },
                constraints: new { culture = "([a-zA-Z]{2}-[a-zA-Z]{2})|[a-zA-Z]{2}" }
         );

        routes.MapRoute(name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );

以下是我的Controller用户中的一些操作:

    public ActionResult Edit(int id);
    public ActionResult EditPassword(int id);
    public ActionResult EditRights(int id);

我希望我的操作 EditPassword EditRights 可以通过 domain / en-us / users / edit / password / 240 和< EM>域/ EN-US /用户/编辑/权利/ 240 的。

我找到了一个解决方案,使用路由属性,但在我的网址中使用了文化(en-us,es-mx,fr-ca),它打破了这一切。

1 个答案:

答案 0 :(得分:1)

您配置的DefaultWithCulture路由将匹配3或4个路段。您的网址(en-us/users/edit/password/240)有5个路段,因此不匹配。

如果你将动作方法名称传递给它,匹配:en-us/users/editpassword/240

如果您希望自己的网址看起来像包含5个细分的示例,则需要做一些额外的工作。首先,您需要考虑到您的操作名称和网址不匹配的事实。一种方法是使用ActionName属性。

[ActionName("password")]
public ActionResult EditPassword(int id);

[ActionName("rights")]
public ActionResult EditRights(int id);

然后,您需要一些新的路由和约束来匹配4或5段网址。要处理的主要问题是您的某些细分受众群重叠。因此,您需要一个约束,以便您可以判断第4段何时是id,或者它是否为行动方法。

基本上,为此,将带有可选id参数的1路由分解为具有所需参数的2条路由(因为当您向id添加约束时,它会使其成为必需的。)

然后为处理网址中额外edit段的本地化和非本地化版本添加其他路由。

// Route to handle culture with 4 segments, ending in numeric id
routes.MapRoute(
    name: "DefaultWithCulture",
    url: "{culture}/{controller}/{action}/{id}",
    defaults: new { culture = CultureHelper.GetDefaultCulture(), controller = "Home", action = "Index" },
    constraints: new { culture = "([a-zA-Z]{2}-[a-zA-Z]{2})|[a-zA-Z]{2}", id = @"\d+" }
);

// Route to handle culture with 3 segments, to make id optional
routes.MapRoute(
    name: "DefaultWithCulture3Segments",
    url: "{culture}/{controller}/{action}",
    defaults: new { culture = CultureHelper.GetDefaultCulture(), controller = "Home", action = "Index" },
    constraints: new { culture = "([a-zA-Z]{2}-[a-zA-Z]{2})|[a-zA-Z]{2}" }
);

// Route to handle culture with 4 or 5 segments
routes.MapRoute(
    name: "DefaultWithCulture5Segments",
    url: "{culture}/{controller}/edit/{action}/{id}",
    defaults: new { culture = CultureHelper.GetDefaultCulture(), controller = "Home", action = "Index", id = UrlParameter.Optional },
    constraints: new { culture = "([a-zA-Z]{2}-[a-zA-Z]{2})|[a-zA-Z]{2}" }
);

// Route to handle default with 3 segments, ending in numeric id
routes.MapRoute(name: "Default",
    url: "{controller}/{action}/{id}",
    defaults: new { controller = "Home", action = "Index" },
    constraints: new { id = @"\d+" }
);

// Route to handle default with 2 segments, to make id optional
routes.MapRoute(name: "Default2Segments",
    url: "{controller}/{action}",
    defaults: new { controller = "Home", action = "Index" }
);

// Route to handle default with 3 or 4 segments
routes.MapRoute(name: "Default4Segments",
    url: "{controller}/edit/{action}/{id}",
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);

如果您希望添加的额外段读取edit以外的其他段,则需要其他路由,因为MVC本身并不理解此URL方案。