【问题标题】:ASP.NET MVC route to page with or without a route dataASP.NET MVC 路由到有或没有路由数据的页面
【发布时间】:2021-11-22 08:07:07
【问题描述】:

我正在尝试开发一个 2 语言的网站,并且我的要求是,如果未指定语言路由值,则必须转到默认语言的页面。 示例:

  1. www.mysite.com/home/products?query=phone
  2. www.mysite.com/en/home/products?query=phone

两条路线都应以英文响应结果页面。

我在 RegisterRoute() 中有这 2 条路由:

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

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

当我浏览第二条路线 (www.mysite.com/en/home/products?query=phone) 时,我收到 404 错误。

我哪里错了?

谢谢

【问题讨论】:

    标签: asp.net-mvc routes


    【解决方案1】:

    您的 url www.mysite.com/en/home/products?query=phone 不起作用,因为网站引擎将 en 视为控制器,将 home 视为 action,将 product 视为 id。

    如果您在这里或使用 google 进行一些研究,您会发现很多问题的解决方案,但每个解决方案都有大量代码来分析路由值、创建新 url 和重定向。因此,如果您的网站很大,有数百个控制器,您可以编写一些代码。否则,如果您只有几个控制器,这可能是最简单的方法

    
    [Route("fr/[controller]/[action]")]
    [Route("en/[controller]/[action]")]
    [Route("[controller]/[action]")]
    public class HomeController : Controller
    
    

    您必须使用另一种语言的字母来代替 fr。而且您不需要将它用于所有控制器,它只需要用于可以使用不包含任何语言的 url 的控制器

    在你的配置中只保留一个默认路由,并在 IgnoreRoutes 之后添加 MapMvcAttributeRoutes

     routes.IgnoreRoute(“{resource}.axd/{*pathInfo}”);
     
        routes.MapMvcAttributeRoutes();
    
     routes.MapRoute(
            name: "default",
            url: "{lang}/{controller}/{action}/{id}",
            defaults: new { lang = "en", controller = "Home", action = "Index", id = UrlParameter.Optional }
        );
    

    【讨论】:

    • 谢谢谢尔盖。如您所示,我在控制器顶部添加了 4 条路线。但情况并没有好转。我是否也应该修改 RegisterRoute 中的某些内容?
    • @Diego 是的,我想你必须添加 MapMvcAttributeRoutes 。查看我的更新答案。
    • 感谢您的宝贵时间!无论如何,它不起作用。我收到了这个错误:在名为“Home”的控制器上名为“Index”的操作上的路由模板“/”不能以正斜杠开头。”
    • 报错就行routes.MapMvcAttributeRoutes();在我的 HomeController 上我得到: [Route("/")] [Route("it/[controller]/[action]")] [Route("en/[controller]/[action]")] [Route( "[controller]/[action]")] 公共类 HomeController : BaseController
    猜你喜欢
    • 2019-05-10
    • 1970-01-01
    • 2013-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-21
    相关资源
    最近更新 更多