Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ASP.NET MVC 4子类中未命中路由_Asp.net_Asp.net Mvc - Fatal编程技术网

ASP.NET MVC 4子类中未命中路由

ASP.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 {

为什么第一条路线要跳过第二条路线?第一个路由具有第二个路由的基本控制器类,因此小部件继承事件,但我的事件“注册”方法不断受到攻击

Url

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的操作。这之前也让我犯了一个错误。

我通过使用共享公共方法的抽象基类解决了这个问题。