5

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

编辑:我的完整路线配置

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)

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

4

3 回答 3

6

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

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

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

编辑:

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

编辑2:

此外,您在那里遇到的情况称为路由冲突。您的路线与Default. 您可以尝试应用约束

于 2013-06-03T10:10:46.353 回答
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")

欢呼

于 2013-06-03T10:31:19.097 回答
1

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

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

于 2013-06-03T10:14:03.027 回答