asp.net-mvc路由问题:参数字典包含参数的空条目

时间:2013-06-03 10:03:41

标签: c# asp.net-mvc asp.net-mvc-routing

我正在尝试使用以下映射路由设置自定义路由

编辑:我的完整路线配置

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)

然后我相应地编辑了路线,现在它正常工作,所以我认为这是默认路由的问题。

3 个答案:

答案 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/11未被识别。如果您希望使用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所以如果提供了可选参数,你可以检查它的值。

并且根据接受的答案看看答案,看似更简单,更清洁的解决方案。