gpt4 book ai didi

asp.net-mvc - 如何在 MVC 选择路由之前添加路由参数

转载 作者:行者123 更新时间:2023-12-04 10:10:36 24 4
gpt4 key购买 nike

我正在尝试向现有的 MVC 3 应用程序添加对不同语言的支持。到目前为止,我的链接是

oldUrl -> myapp.com/Item/Details/5/some-title

并且有来自网络上不同地方的网站链接。但现在我想更改 URL,以便包含语言:
newUrl -> kmyapp.com/en/Item/Details/5/some-title

但是我希望 oldUrl 链接有效。问题是我该怎么做......最简单的方法是添加另一条路线,但我已经有太多的路线,而且它变得有点难看,当我从一个没有的页面创建网址时有语言链接也没有语言,所以我必须做其他事情。

另一种方法是覆盖在 MVC 尝试将请求映射到特定路由之前存在的内容,但已经解析了请求 url 并填充了 routeValues 字典。所以我可以只检查语言,如果它不包含在路由参数中,我可以自己添加它并调用父类的实现以继续。那可能吗?我应该看什么 - UrlRoutingModule , MvcHttpHandler或者是其他东西?我可以覆盖什么以及如何告诉 MVC 使用我的版本?

任何其他想法也将不胜感激!

最佳答案

当然有很多解决方案。我要给你看两个:

  • 您在应用程序中控制的
  • 您在应用程序之外控制的一个(在 IIS 上)

  • 解决方案一——Asp.net MVC 路由
    提供涵盖旧路由和新路由的路由:
    routes.MapRoute(
    "New",
    "{lang}/{controller}/{action}/{id}",
    new { lang = "en", controller = "Home", action = "Index", id = UrlParameter.Optional },
    new { lang = "en|de|it|es|fr" }
    );
    routes.MapRoute(
    "NewEx",
    "{lang}/{controller}/{action}/{id}/{title}",
    new { lang = "en", controller = "Home", action = "Index", id = UrlParameter.Optional, title = UrlParameter.Optional },
    new { lang = "en|de|it|es|fr" }
    );

    routes.MapRoute(
    "Old",
    "{controller}/{action}/{id}",
    new { lang = "en", controller = "Home", action = "Index", id = UrlParameter.Optional }
    );
    routes.MapRoute(
    "OldEx",
    "{controller}/{action}/{id}/{title}",
    new { lang = "en", controller = "Home", action = "Index", id = UrlParameter.Optional, title = UrlParameter.Optional }
    );
    如您所见 我也为旧路线提供了语言默认值因为它不存在于 URL 中。是否要这样做是您自己的决定,但是这种路由可以不重复您的 Controller 操作。在任何情况下,您都必须定义一种可以通过这种方式提供的默认语言。
    更大的问题是您是否仍想支持旧 URL 或者您更愿意重定向它们(HTTP Redirect Permanent Status 301)。
    永久重定向
    将旧路线更改为:
    routes.MapRoute(
    "Old",
    "{controllerOld}/{actionOld}/{idOld}",
    new { controller = "Redirect", action = "Permanent", id = UrlParameter.Optional }
    );
    routes.MapRoute(
    "OldEx",
    "{controllerOld}/{actionOld}/{idOld}/{titleOld}",
    new { controller = "Redirect", action = "Permanent", id = UrlParameter.Optional, title = UrlParameter.Optional }
    );
    然后编写一个执行重定向的 Controller 类:
    public class RedirectController : Controller
    {
    public ActionResult Permanent(string controllerOld, string actionOld, string idOld, string titleOld)
    {
    return RedirectToRoutePermanent(new {
    lang = "en",
    controller = controllerOld,
    action = actionOld,
    id = idOld,
    title = titleOld
    });
    }
    }
    解决方案二——IIS URL重写模块
    此解决方案依赖于 IIS URL 重写模块,您可以在其中将任何请求重写为您喜欢的默认语言,而无需选择语言。
    我不打算在这里写 URL 重写是如何工作的,因为有大量的网络资源提供了详细的信息。

    关于asp.net-mvc - 如何在 MVC 选择路由之前添加路由参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9184645/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com