我在我的应用程序中注册了一个自定义路由,但是只有默认路由可以正常工作。
这是我的路线图:
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)。
我该怎么做才能使我的自定义路线生效?
答案 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之后。