【问题标题】:MVC3 and Ajax error "The parameters dictionary contains a null entry for parameter ..."MVC3 和 Ajax 错误“参数字典包含参数的空条目......”
【发布时间】:2012-04-11 12:34:21
【问题描述】:

这让我发疯了!

我有一个使用以下脚本使用 Ajax 填充的视图。

function loadAcquisitions() {
    var description = $("input#searchDescription").val();
    var startDate = $("input#searchStartDate").val();
    var endDate = $("input#searchEndDate").val();

    $.ajax({
        type: "POST",
        dataType: "json",
        url: "/Acquisition/Find",
        data: { searchDescription: description, searchStartDate: startDate, searchEndDate: endDate },
        success: function (jsonresults) {
            $("tbody#acquisitionContent").find("tr").remove().end();

            var pageCount = parseInt(jsonresults.length / pageSize);
            var startItemIndex = currentPageIndex * pageSize;
            var itemsToDisplay = pageSize + startItemIndex;

            if ((jsonresults.length - startItemIndex) < pageSize) {
                itemsToDisplay = jsonresults.length - startItemIndex + pageSize;
            }

            for (var i = startItemIndex; i < itemsToDisplay; i++) {
                $("tbody#acquisitionContent").append('<tr>' +
                    '<td><a href="/Acquisition/Edit/' + jsonresults[i].AcquisitionID + '">Edit</a></td>' +
                    '<td>' + jsonresults[i].AcquisitionDescription + '</td>' +
                    '<td>' + jsonresults[i].AcquisitionDate + '</td>' +
                    '<td>$' + jsonresults[i].AcquisitionCost + '</td>' +
                    '<td>$' + jsonresults[i].InstallationCost + '</td>' +
                    '<td class="last">$' + jsonresults[i].DeliveryCost + '</td>' +
                    '</tr>');
            }

            $('#pageTitle').text('Page ' + (currentPageIndex + 1) + ' of ' + pageCount);
        },
        error: function (c, b, a) {
            alert(a);
        }
    });
}

请注意,链接是使用以下行生成的:

'<td><a href="/Acquisition/Edit/' + jsonresults[i].AcquisitionID + '">Edit</a></td>'

链接标签似乎生成正确,格式为

/Acquisition/Edit/123

在控制器中,我有一个名为“编辑”的函数,如下所示:

public ActionResult Edit(int acquisitionID)
{
    Acquisition acquisition = Acquisition.Get(acquisitionID);
    return View(acquisition);
}

然后,在 global.asax 中,我为“编辑”定义了一条路线,如下所示:

routes.MapRoute(
    "EditAcquisition",
    "{controller}/{action}/{acquisitionID}",
    new { controller = "Acquisition", action = "Edit"}
    );

我已尝试更改控制器中的“编辑”功能以接受可以消除错误的可为空的 int (int?) 获取 ID - 但不会改变将空值传递到控制器的事实Edit' 功能来自 Ajax 代码生成的链接。

任何帮助将不胜感激!

谢谢!

更新:

当我更新 global.asax 并将“acquisitionID”添加为这样的参数时:

routes.MapRoute(
    "EditAcquisition",
    "{controller}/{action}/{acquisitionID}",
    new { controller = "Acquisition", action = "Edit", acquisitionID = 0 }
    );

应用程序的行为非常不同,因为导航链接现在都附加了“索引”。

/Acquisition/

变成

/Acquisition/Index

更新:

这里是 global.asax 的 RegisterRoutes 方法

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapRoute(
        "EditProperty",
        "{controller}/{action}/{propertyID}",
        new {controller = "Property", action = "Edit"}
        );

    routes.MapRoute(
        "EditAssignee",
        "{controller}/{action}/{assigneeID}",
        new {controller = "Assignee", action = "Edit"}
        );

    routes.MapRoute(
        "EditAcquisition",
        "{controller}/{action}/{acquisitionID}",
        new {controller = "Acquisition", action = "Edit"}
        );

    routes.MapRoute(
        "Default",
        "{controller}/{action}/{id}",
        new {controller = "Home", action = "Index", id = UrlParameter.Optional}
        );
}

【问题讨论】:

  • 您能否显示所有路线(按照您定义它们的顺序),因为似乎另一条路线与请求匹配

标签: asp.net-mvc-3 asp.net-ajax routes


【解决方案1】:

你的路线

routes.MapRoute(
        "EditProperty",
        "{controller}/{action}/{propertyID}",
        new {controller = "Property", action = "Edit"}
        );

匹配所有其他路由..(因为它们都具有相同的/controller/action/id模式

new {controller = "Property", action = "Edit"} 提供的值是默认值,不是允许的值..

因此,/somecontroller/someaction/someid 形式的任何 url 都将与之匹配,并且 id 将被称为propertyID

这就是为什么你没有收到acquisitionID

要么只保留那一条路线并将propertyID 命名为id 之类的通用名称,然后在您的方法中使用它,或者将constraints 用于具有相同模式的所有路线

routes.MapRoute(
        "EditProperty",
        "{controller}/{action}/{propertyID}",
        new {controller = "Property", action = "Edit"},
        new {controller = "Property", action="Edit"} // constraint
        );

【讨论】:

  • 就是这样......我现在明白问题所在了。感谢您的帮助!
【解决方案2】:

对于我的路线,我总是包含URLParameter 设置:

routes.MapRoute(
                "EditAcquisition",
                "{controller}/{action}/{acquisitionID}",
                new
                {
                    controller = "Acquisition",
                    action = "Edit",
                    acquisitionID = UrlParameter.Optional
                }
            );

即使参数不是可以为空的 int 也有效。我也做了

acquisitionID = 0

恐怕我无法真正解释为什么它会起作用。

编辑

其他的尝试

"EditAcquisition",
 "Acquisition/Edit/{acquisitionID}",
 new
 {
     controller = "Acquisition",
     action = "Edit",
     acquisitionID = UrlParameter.Optional
 }

因此 URL 与第二个参数 URL 进行匹配,而不是第三个参数,这是默认值。

【讨论】:

  • 抱歉 - 我刚刚尝试过,现在我还有一些其他问题需要补充。
  • @Andy 你能发布你的 global.asax 的整个路线部分吗?如果你有的话,也可以在“区域”部分中发布。我怀疑在EditAcquisition 之前匹配了另一条路线。
  • 我已将它们添加到问题中
猜你喜欢
  • 2014-09-10
  • 1970-01-01
  • 1970-01-01
  • 2017-05-12
  • 2018-01-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多