MVC路线冲突似乎很奇怪

时间:2015-09-18 10:21:45

标签: asp.net-mvc model-view-controller routes

我正在使用MVC 5.1和AutoFac。

我不明白为什么来自每个控制器的以下路线与此网址冲突:https://localhost:44300/Home/login

我认为它会映射到第一种方法。我收到了这个错误:

找到了与URL匹配的多种控制器类型。如果多个控制器上的属性路由与请求的URL匹配,则会发生这种情况。

请求已找到以下匹配的控制器类型: AllThings.WebUI.Controllers.AccountController AllThings.WebUI.Controllers.PostController

    public class AccountController : Controller
{
    //
    // GET: /Account/Login
    [Route("~/{site}/Login")]
    [Route("~/Account/Login")]
    [Route("~/{country:maxlength(2)}/{site}/Login")]
    [Route("~/{country:maxlength(2)}/Account/Login")]
    [AllowAnonymous]
    public ActionResult Login(string returnUrl, string country, string site)
    {
        return View();
    }
}


    public class PostController : Controller
{
    [Route("~/{site}/{CategoryUrl?}")]
    [Route("~/{country:maxlength(2)}/{site}/{CategoryUrl?}", Name = "ResultList")]
    [AllowAnonymous]
    public ActionResult List(string country, string site, SearchCriteriaViewModel searchCriteriaViewModel)
    {
        return View("List", searchCriteriaViewModel);
    }
}

1 个答案:

答案 0 :(得分:1)

主要问题是您有3条可能匹配/Home/Login的路线。

[Route("~/{site}/Login")]
[Route("~/Account/Login")]
[Route("~/{site}/{CategoryUrl?}")]

自由使用占位符,尤其是你在URL模板定义中所拥有的东西并不是一件好事。您应该在URL中使用文字,或者如果您使用占位符,则应该对它们进行约束,以便它们不会发生冲突。

请注意,以下路径也会发生冲突:

[Route("~/{country:maxlength(2)}/{site}/Login")]
[Route("~/{country:maxlength(2)}/Account/Login")]
[Route("~/{country:maxlength(2)}/{site}/{CategoryUrl?}", Name = "ResultList")]

其中任何一个都可以匹配UK/Account/Login

此外,使用代字号(~)是覆盖路由前缀(请参阅MSDN documentation)。如果你的控制器没有定义一个,你应该从第一个段或占位符开始。