为什么我的自定义MapRoute会显示“参数字典包含参数的空条目”

时间:2019-04-26 12:49:16

标签: c# asp.net-mvc-5 routes

我在我的应用程序中注册了一个自定义路由,但是只有默认路由可以正常工作。

这是我的路线图:

        routes.MapRoute(
            name: "MyCustomRoute",
            url: "Foo/Index/{myid}",
            defaults: new { controller = "Foo", action = "Index", myid = UrlParameter.Optional },
            namespaces: new[] { "MyApp.Controllers" }
        );

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
            namespaces: new[] { "MyApp.Controllers" }
        );

还有我的FooController动作方法

 public ActionResult Index(int MyID)
    {
        //...
   return View();
    }

如果我将myid参数添加到查询字符串中,则一切正常(即/ Foo / Index /?myid = 1)。但是重写的网址(/ Foo / Index / 1)导致此错误:

The parameters dictionary contains a null entry for parameter 'MyID' of non-nullable type 'System.Int32' for method 'System.Web.Mvc.ActionResult Index(Int32)' in 'TPC_CS_Portal.Controllers.FooController'. An optional parameter must be a reference type, a nullable type, or be declared as an optional parameter.
Parameter name: parameters

如上所述,我的其他使用默认路由(带有id参数)的控制器都可以正常工作(例如/ SomethingElse / Index / 1)。

我该怎么做才能使我的自定义路线生效?

1 个答案:

答案 0 :(得分:1)

这里的问题是在其他地方针对FooController定义了一个单独的MapRoute:

routes.MapRoute(
        name: "MyOtherCustomRoute",
        url: "Foo/Index/{param1}/{param2}",
        defaults: new { controller = "Foo", action = "Index", param1 = UrlParameter.Optional, param2 = UrlParameter.Optional },
        namespaces: new[] { "MyApp.Controllers" }
    );

这是优先级(与请求的URL匹配),所以我四处移动,使其出现在MyCustomRoute之后。