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)

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

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

在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/11是未识别的。如果您希望使用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 '点击链接,所以如果提供了可选参数,你可以对它的值进行一些检查。

还要看看公认的答案后面的答案,这似乎是一个更简单、更干净的解决方案。