RedirectToAction()生成错误的URL

时间:2013-10-10 13:14:44

标签: asp.net asp.net-mvc

我遇到了MVC 4的问题,我猜这是非常微不足道的事情,但是在最后一天它一直困扰着我,我似乎无法弄明白。

我有这个网址:

http://www.example.com/my-dashed-url

我有一个名为:

的控制器
public class MyDashedUrlController: Controller
{
}

我只有两条这样的路线:

routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

routes.MapRoute("my-dashed-url",
               "my-dashed-url/{action}",
               new { controller = "MyDashedUrl", action = "Index" });

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

我到达指数就好了。但是,当我这样做时:

   public ActionResult Index()
    {
        if (NoUserIsLoggedOn)
            return RedirectToAction("Logon", "MyDashedUrl");

        return View();
    }

    public ActionResult Logon()
    {
        Contact c = GetContact();

        return View(c);
    }

它没有正确地将我重定向到“登录”操作。 它应该将我重定向到:

 http://www.example.com/my-dashed-url/logon

但它尝试将我重定向到:

 http://www.example.com/logon

...不起作用(404 Not Found)

我错过了什么。谁能发现它?如果有人需要更多信息,请告诉我。

而且每个RedirectToAction都在这个控制器中执行相同的操作。 Html.BeginForm(“Logon”,“MyDashedUrl”)也会生成: http://www.example.com/logon

我想它必须对我定义的路线做一些事情,但我找不到有问题的路线,因为它们都是一样的。如果我禁用除MVC中的默认路由以外的所有路由,问题仍然是相同的

1 个答案:

答案 0 :(得分:1)

确保您已声明此自定义路线之前是默认路线:

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

    routes.MapRoute(
        "my-dashed-url",
        "my-dashed-url/{action}",
        new { controller = "MyDashedUrl", action = "Index" }
    );

    routes.MapRoute(
        "Default", // Route name
        "{controller}/{action}/{id}", // URL with parameters
        new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
    );
}

请记住,路线按您声明的顺序进行评估。因此将使用匹配请求的第一个路由。如果在默认路由之后声明自定义路由,则它是与请求匹配的默认路由。