【发布时间】:2013-05-29 10:59:09
【问题描述】:
我正在尝试使用以下映射路由设置自定义路由
编辑:我的完整路线配置
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)
然后我相应地编辑了路由,现在它可以工作了,所以我认为这是默认路由的问题。
【问题讨论】:
-
是他们在此之前或之后配置的任何其他路由
-
如果您希望能够在不指定 id 的情况下调用
Add,fixtureId应该可以为空 -int? fixtureId。路由上下文中的“可选”意味着它不必在 URL 中,这样您就可以执行public ActionResult Add() {/*no parameters*/}之类的操作 -
我唯一能想到的是您使用的是不可为空的 int 吗? Id 可能已融入 MVC 框架,因此可能会有所不同。
-
抱歉,只是为了澄清一下我每次都想传入一个参数,我已将其更改为可为空的参数 int? fixtureId 但每次我调用它时,参数都是 null,Result/Add/1 和 Result/Add 都可以工作,但传入一个 null。
标签: c# asp.net-mvc asp.net-mvc-routing