我正在使用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);
}
}
答案 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)。如果你的控制器没有定义一个,你应该从第一个段或占位符开始。