【问题标题】:asp.net-mvc routing issue : parameters dictionary contains a null entry for parameterasp.net-mvc 路由问题:参数字典包含参数的空条目
【发布时间】: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 的情况下调用 AddfixtureId 应该可以为空 - 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


【解决方案1】:

在控制器操作中使用可为空的 int。

public ActionResult Add(int? fixtureId)
{
   // return model to view etc..
}

但问题是,如果这确实是一个 ID,如果用户请求一个空/空白 ID,它会如何反应?该 ID 是您数据库中的密钥吗?如果您能够处理或在 ID 为空白/null 时提供默认页面,则可以将其设为 null。

编辑:

这是因为 ASP.NET 会假定您请求中的未识别参数是 id,在您的情况下,Results/Add/11 是未识别的。如果您想让该代码使用fixtureId,您应该使用Results/Add?fixureId=1。所以归根结底,这不是因为路由,而是因为你拥有的 Action 中的参数。

EDIT2:

此外,您在那里遇到的情况称为路由冲突。您的路线与Default 冲突。您可以尝试申请constraints

【讨论】:

  • 我可以让它为空并相应地处理它。问题是当我实际使用 Result/Add/1 传入一个值时,例如传入的值始终为 null。
  • 好的,看起来就足够了,如果可能的话,我想对用户隐藏参数,但可能必须通过发布表单来做到这一点,谢谢。
【解决方案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 / 异常“参数字典包含参数'fixtureId'的空条目”如果您没有为任何操作链接或路由表单提供特定的路由名称,则会出现,因为 MVC 将使用默认路由进行路由。因此,您需要为您的自定义路由提供特定的路由名称才能工作,如下所示:

@Html.ActionLink("Test custom Route", "Add", "Home", new { fixtureId = 1 }, "ResultAdd")

欢呼

【讨论】:

    【解决方案3】:

    看看这种添加开发人员称之为“NullableConstraint”的方法clicky link 因此,如果提供了可选参数,您可以对其值进行一些检查。

    并在接受的答案之后查看似乎更简单、更清洁的解决方案的答案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-12
      • 1970-01-01
      相关资源
      最近更新 更多