【问题标题】:RedirectToRoute in MVC Not Redirecting Using Default RouteMVC 中的 RedirectToRoute 不使用默认路由重定向
【发布时间】:2014-11-17 13:19:56
【问题描述】:

当我尝试使用 RedirectToRoute() 进行重定向时,它不适用于特定情况的默认路由。根据 RouteConfig.cs,只要它识别出一个带有美食的 URL,它的优先级就是美食。我想在访问美食控制器时在特定场景中使用默认路由。它应该重定向到美食控制器中的 Redirect 操作。是否可以?。

代码sn-p:

RouteConfig.cs

public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            "Cuisine", 
            "cuisine/{name}",
            new { controller = "Cuisine", action = "Search", name = UrlParameter.Optional });

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

CuisineController.cs

 public class CuisineController : Controller
{
    // GET: Cuisine
    public ActionResult Search(string name)
    {
        return RedirectToRoute("Default", new { controller = "Cuisine", action = "Redirect" });
    }

    public ActionResult Redirect()
    {
        return Content("Restaurant Closed");
    }
}

【问题讨论】:

    标签: c# asp.net-mvc-4 redirect


    【解决方案1】:

    正确生成重定向您遇到的问题是: http://app.com/cuisine/redirect 匹配两个规则并且:

     routes.MapRoute(
                "Cuisine", 
                "cuisine/{name}",
                new { controller = "Cuisine", action = "Search", name = UrlParameter.Optional });
    

    在路由表中排在第一位,所以它是使用的。 您可以通过在Cuisine 之前添加额外的重定向路由配置来简单地修复它:

        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
        routes.MapRoute(
                  "Cuisine-redirect",
                  "cuisine/redirect",
                  new { controller = "Cuisine", action = "Redirect"});
        routes.MapRoute(
                   "Cuisine",
                   "cuisine/{name}",
                   new { controller = "Cuisine", action = "Search", name = UrlParameter.Optional });
    
        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );
    

    这样Cuisine-redirect路由会先匹配并执行。

    【讨论】:

    • 感谢您的快速回复。您添加的 MapRoute 是完全硬编码的。如果有一个名为 RedirectX 的附加操作,它将不起作用。有什么办法可以强制默认路由?
    • 是的,但这需要您更改重定向网址。您不能使用appurl.com/cuisine/redirect,因为这将与您的Cuisine 路由匹配,您可以使用appurl.com/cuisine/name/redirect 或任何带有附加路由参数的东西,并使用属性路由来容纳附加参数。或者只需将您的“Cuisine”路线更改为指向appurl.com/cuisine/search/name,这样您就可以完全解决问题(当然,如果可以的话)
    【解决方案2】:

    请尝试以下代码而不是您的代码

    在 RedirectRoute 中,您也可以使用以下代码进行重定向

    首先给出动作名称,然后给出控制器名称。 请深看粗体区域。

     public class CuisineController : Controller
    {
        public ActionResult Search(string name)
       {
          return RedirectToRoute(**"Redirect", "Cuisine"**);
       }
    
       public ActionResult Redirect()
       {
          return Content("Restaurant Closed");
       }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-27
      相关资源
      最近更新 更多