我正在与国际化和漫长的路线合作。 我的网址看起来像 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),它打破了这一切。
答案 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方案。