Asp.net-mvc路由问题:参数字典包含一个空的参数条目
本文关键字:参数 包含一 字典 net-mvc 路由 问题 Asp | 更新日期: 2023-09-27 18:16:52
我正在尝试使用以下映射路由设置自定义路由
edit: my full route config
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)
然后我相应地编辑了路由,现在它工作了,所以我认为这是默认路由的问题。
在Controller Action中使用一个可为空的int。
public ActionResult Add(int? fixtureId)
{
// return model to view etc..
}
但问题是,如果这确实是一个ID,如果用户请求一个null/blank ID,它会如何反应?你数据库里的ID是钥匙吗?如果您能够处理或提供默认页面(如果ID为空白/null),则可以将其设置为空。
编辑:这是因为ASP。NET将假定请求中未识别的参数是id
,在您的情况下,Results/Add/1
、1
是未识别的。如果您希望使用fixtureId
使该代码工作,则应该使用Results/Add?fixureId=1
。最终,它不是因为路由,而是因为Action中的参数
EDIT2:
同样,你所经历的被称为路由冲突。你的路线与Default
冲突。您可以尝试应用约束。
从你的帖子,我认为你的问题是把你的自定义路由默认后,像这样:
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 }
:如果你没有为任何动作链接或路由表单指定具体的路由名,就会出现"参数字典中包含一个空的参数' fixturid '",因为MVC会使用默认路由来路由。所以你需要给特定的路由名让你的自定义路由可以工作,像这样:
@Html.ActionLink("Test custom Route", "Add", "Home", new { fixtureId = 1 }, "ResultAdd")
快乐看看这个方法,添加了开发人员所说的' nullableconstrint '点击链接,所以如果提供了可选参数,你可以对它的值进行一些检查。
还要看看公认的答案后面的答案,这似乎是一个更简单、更干净的解决方案。