我正在尝试使用以下映射路由设置自定义路由
编辑:我的完整路线配置
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
#region FixtureAdmin
routes.MapRoute(
name: "FixtureEdit",
url: "{controller}/{action}/{id}",
defaults: new { controller = "FixtureAdmin", action = "Edit", id = UrlParameter.Optional }
);
#endregion
#region Results
routes.MapRoute(
name: "ResultAdd",
url: "{controller}/{action}/{fixtureId}",
defaults: new { controller = "Result", action = "Add", fixtureId = UrlParameter.Optional }
);
#endregion
我的控制器代码
public ActionResult Add(int fixtureId)
{
// return model to view etc..
}
即使我已将参数指定为可选参数,也会出现异常。
参数字典包含参数'fixtureId'的空条目
奇怪的是,如果我将Add操作的参数更改为'Id',则以下URL将起作用Result / Add / 1。我很困惑,是否有一些默认路由覆盖了我的自定义路由?为什么将参数更改为'Id'有效?
修改
为了测试,我在动作中添加了另一个参数
public ActionResult Add(int? fixtureId, int? testId)
然后我相应地编辑了路线,现在它正常工作,所以我认为这是默认路由的问题。
答案 0 :(得分:6)
在Controller Action中使用nullable int。
public ActionResult Add(int? fixtureId)
{
// return model to view etc..
}
但问题是,如果确实是一个ID,如果用户请求空/空ID,它会如何反应?该ID是您数据库中的关键吗?如果您能够处理或提供默认页面,如果ID为空/空,则可以使其可为空。
修改强>
这是因为ASP.NET会假设您的请求中的未识别参数是id
,在您的情况下,Results/Add/1
,1
未被识别。如果您希望使用fixtureId
使代码正常工作,则应使用Results/Add?fixureId=1
。所以最终,它不是因为路由,而是因为你拥有Action中的参数。
<强> EDIT2:强>
此外,您遇到的情况称为路由冲突。您的路线与Default
相冲突。您可以尝试应用constraints。
答案 1 :(得分:2)
2, 从你的帖子我认为你的问题是在默认情况下放置你的自定义路线,如下所示:
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);
routes.MapRoute(
name: "ResultAdd",
url: "{controller}/{action}/{fixtureId}",
defaults: new { controller = "Home", action = "Add", fixtureId = UrlParameter.Optional }
所以: 1 / exception“如果你没有给出任何动作链接或路由表单的特定路由名称,参数字典包含参数'fixtureId'的空条目”,因为MVC将使用默认路由进行路由。因此,您需要为您的自定义路由提供特定的路由名称,如下所示:
@Html.ActionLink("Test custom Route", "Add", "Home", new { fixtureId = 1 }, "ResultAdd")
啦啦队
答案 2 :(得分:1)
看看这种添加开发人员称之为'NullableConstraint'的方法clicky link所以如果提供了可选参数,你可以检查它的值。
并且根据接受的答案看看答案,看似更简单,更清洁的解决方案。