MVC中的RedirectToRoute不使用默认路由重定向

时间:2014-11-17 13:19:56

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

当我尝试使用RedirectToRoute()重定向时,它不适用于特定情况的默认路由。根据RouteConfig.cs,只要它识别出带有美食的网址,就会优先考虑烹饪。我想在访问美食控制器时在特定场景中使用默认路由。它应该重定向到菜单控制器中的重定向操作。可能吗?。

代码段:

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");
    }
}

2 个答案:

答案 0 :(得分:0)

正确生成重定向您遇到的问题是: 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路由将首先匹配并执行。

答案 1 :(得分:0)

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

在RedirectRoute中,您还可以使用以下代码重定向

通过首先给出动作名称,然后给出控制器名称。 请大胆地看一下。

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

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