【问题标题】:MVC Routing Issue when trying www.example.com/id尝试 www.example.com/id 时出现 MVC 路由问题
【发布时间】:2016-05-11 19:44:04
【问题描述】:

假设我有一个网站www.example.com

默认路由看起来像

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

好的,但假设我希望我的网站在我转到 www.example.com/id 时转到 www.example.com/login/index/id

我将如何为此配置/添加路由,而不会破坏我实际尝试转到www.example.com/controller 的其他页面?

编辑:不幸的是 id 是一个字符串,所以我没有任何我能想到的具体约束。想想也许我应该说 companyname 或 sitename 而不是 id,所以 URL 看起来像 www.example.com/companyname 。

到目前为止,我想出的唯一解决方案是像这样为我的每个控制器添加一个 maproute

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

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

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

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

这会起作用,但我有很多控制器,如果我将来添加一个并且忘记调整路线,它将失败。此外,这不太可能,但如果公司名称恰好与我的控制器名称之一相同,它也会失败。

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-5 routes


    【解决方案1】:

    在控制器中你可以重定向到另一个控制器/动作:

    public ActionResult yourAction()
    {
      return  RedirectToAction("nameAction","nameController");
    }
    

    【讨论】:

      【解决方案2】:

      您是否尝试过先添加此映射:

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

      这应该可行,但请记住,路由是按顺序评估的,因此您必须组织映射才能访问您网站中的所有页面。

      例如,像 www.example.com/Product 这样的路由可能会被错误地重定向到 /Login。

      编辑:您可以添加约束,因此如果 id 是 int 值,您可以尝试以下操作:

       routes.MapRoute("Custom", "{id}",
                      new { controller = "Login", action = "Index" },
                      new { id = @"\d+" }
      

      编辑 2:将 id 作为字符串值,我看到的唯一解决方案是按照您所说的手动添加每个控制器,或者添加如下内容:

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

      );

      这样你以后就不需要更新每条路线了。

      【讨论】:

      • 我确实尝试过,但就像你说的那样,它会在我的其他控制器访问 www.example.com/Product 时产生问题,然后转到我的登录控制器而不是我的产品控制器。
      • 不幸的是 id 是一个字符串。例如,它可以是公司名称。我已经编辑了我的问题。
      • 也许您可以尝试使用操作过滤器,因此如果它是公司名称,您可以重定向到您需要的任何操作。见asp.net/mvc/overview/older-versions-1/controllers-and-routing/…
      【解决方案3】:

      请尝试以下路由

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

      删除其他控制器特定的路由。现在您可以使用导航到登录 url : - www.example.com/companylogin/{id} 和所有其他 url 重定向默认路由。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-03
        • 1970-01-01
        • 1970-01-01
        • 2016-01-17
        • 2021-08-24
        • 2017-09-28
        相关资源
        最近更新 更多