ASP.NET MVC 4子类中未命中路由
为什么第一条路线要跳过第二条路线?第一个路由具有第二个路由的基本控制器类,因此小部件继承事件,但我的事件“注册”方法不断受到攻击 UrlASP.NET MVC 4子类中未命中路由,asp.net,asp.net-mvc,Asp.net,Asp.net Mvc,为什么第一条路线要跳过第二条路线?第一个路由具有第二个路由的基本控制器类,因此小部件继承事件,但我的事件“注册”方法不断受到攻击 Url Widgets/v1/RegistrationWidget?eventid=3762 路线 routes.MapRouteLowercase( "DefaultWidget", "widgets/v{version}/{action}widget", new {
Widgets/v1/RegistrationWidget?eventid=3762
路线
routes.MapRouteLowercase(
"DefaultWidget",
"widgets/v{version}/{action}widget",
new { controller = "Widgets", action = "NotFound", version = 1, slug="event" },
new { version = @"\d+" }
);
routes.MapRouteLowercase(
"NamedEvent",
"{Id}/{slug}/{action}",
new { controller = "Event", action = "Index", slug = "event" },
new { Id = @"\d+" }
);
小部件控制器
public partial class WidgetsController : EventController
{
public virtual ActionResult RegistrationWidget(int version, int? eventId, string slug, int? divisionTeamId = null, int? divisionId = null)
{
return GetRegistration(eventId, divisionId, divisionTeamId, new WidgetRegistrationViewModel(version));
}
public partial class EventController : SiteController
{
public virtual ActionResult Registration(int? id, string slug, int? divisionTeamId = null, int? divisionId = null)
{
return GetRegistration(id, divisionTeamId, divisionTeamId, new EventRegistrationViewModel());
}
事件控制器
public partial class WidgetsController : EventController
{
public virtual ActionResult RegistrationWidget(int version, int? eventId, string slug, int? divisionTeamId = null, int? divisionId = null)
{
return GetRegistration(eventId, divisionId, divisionTeamId, new WidgetRegistrationViewModel(version));
}
public partial class EventController : SiteController
{
public virtual ActionResult Registration(int? id, string slug, int? divisionTeamId = null, int? divisionId = null)
{
return GetRegistration(id, divisionTeamId, divisionTeamId, new EventRegistrationViewModel());
}
根据您的url
Widgets/v1/RegistrationWidget?eventid=3762
操作名称将被计算为Registration
,而不是您期望的RegistrationWidget
,因此,mvc实际上使用第一个路由,但将其转发给基类方法。无论您在花括号之间放置什么,路由引擎都将使用它来尝试并查找您要查找的操作,因为您正在请求RegistrationWidget,并且您的路由设置为{action}widget路由引擎将在WidgetsController类中查找名为Registration的操作。这之前也让我犯了一个错误。我通过使用共享公共方法的抽象基类解决了这个问题。