【发布时间】:2014-04-15 16:59:04
【问题描述】:
我在使用属性路由时遇到了不明确的路由问题。问题源于(我相信)在我们的路线根部使用可变参数。让我烦恼的是字面参数似乎没有优先,MVC5无法确定使用哪个路由。
我之前在其他路线上遇到过这种情况,并认为我已经通过定义约定路线来解决问题。考虑到这一点,我在哪里可以找到有关属性路由和解决歧义的最佳实践的更多信息?
这是我遇到问题的代码以及异常。
“/”应用程序中的服务器错误。
找到多个与 URL 匹配的控制器类型。如果多个控制器上的属性路由与请求的 URL 匹配,就会发生这种情况。
请求找到了以下匹配的控制器类型:
帐户控制器
圆形控制器
说明:在执行当前网络请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。
异常详情:System.InvalidOperationException:找到多个与 URL 匹配的控制器类型。如果多个控制器上的属性路由与请求的 URL 匹配,就会发生这种情况。
请求找到了以下匹配的控制器类型:
帐户控制器
圆形控制器
RouteConfig.cs
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
// I added this constraint resolver to resolve some other ambiguous routes that end
// with a literal, but MVC5 wasn't able to determine whether to use those routes
var constraintResolver = new System.Web.Mvc.Routing.DefaultInlineConstraintResolver();
constraintResolver.ConstraintMap.Add("notWriteAction", typeof(IsNotWriteActionConstraint));
routes.MapMvcAttributeRoutes(constraintResolver);
// This is the convention route I added to resolve another ambiguous route.
routes.MapRoute(
name: "Account",
url: "Account/{action}/{GroupName}/{AccessToken}",
defaults: new { controller = "Account", action = "Login", GroupName = UrlParameter.Optional, AccessToken = UrlParameter.Optional }
);
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
RoundController.cs
public class RoundController : ControllerBase
{
[Route("{groupid}/{campaignid}/{accesstoken}")]
public async Task<ActionResult> TempRoundLink(string groupid, string campaignid, string accesstoken)
{
}
}
AccountController.cs
public class AccountController : ControllerBase
{
[AllowAnonymous]
[Route("Account/ResetPassword/{token}")]
public async Task<ActionResult> ResetPassword(string token)
{
}
}
【问题讨论】:
-
有同样的麻烦。我可以通过添加一个否定的正则表达式来解决它,但我认为这是不对的。它会很快失控并变得难以维护。
-
嗨@JoshWheelock,我需要道歉 - 我打算写下我找到的解决方案。我也开始有一个约束,但为了更易于维护而放弃了它。我最终剥离了我们正在使用的所有 Microsoft 属性路由,并使用了“属性路由”,结果证明这是一个完全不同的包。 attributerouting.net它一直在工作!
-
@aholmes url 已失效,当前 url 为 htmlpreview.github.io/?https://github.com/mccalltd/…
-
感谢您更新链接!
标签: c# asp.net-mvc-5 attributerouting