MVC 路由冲突似乎很奇怪
MVC Route conflict seems strange
我正在使用 MVC 5.1 和 AutoFac。
我不明白为什么每个控制器的以下路由与此冲突URL: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);
}
}
主要问题是您有 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)。如果您的控制器没有定义,您应该从第一个段或占位符开始。
我正在使用 MVC 5.1 和 AutoFac。
我不明白为什么每个控制器的以下路由与此冲突URL: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);
}
}
主要问题是您有 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)。如果您的控制器没有定义,您应该从第一个段或占位符开始。