1

在我的 MVC 视图模型中,我有一个表格,里面有一个表格。

从我的 javascript 中,我正在调用我的控制器,如下所示:

$.ajax(
    {
        type: "POST",
        url: "@Url.Action("ReorderClues", "Clues", Model)",
        data: JSON.stringify(positions),
        contentType:'application/json'
    });

我的控制器签名如下:

public ActionResult ReorderClues(TreasureHuntDetails treasureHuntDetails, int[] ids)

我发现当 javascript 以这种方式调用控制器时,数据模型(TreasureHuntDetails 对象)仅填充了 TreasureHuntId,其他所有内容均为空。第二个参数,ids 数组填充成功 - 这是我在 ajax 函数中使用 JSON.stringify() 的参数。

我无法弄清楚为什么除了 TreasureHuntId 之外的其他所有内容都是空的。在表单中,对象的每个属性都有一个 HiddenFor 行,如下所示:

        @Html.HiddenFor(m => m.CompletionMessage)
        @Html.HiddenFor(m => m.Description)
        @Html.HiddenFor(m => m.Clues)
        @Html.HiddenFor(m => m.Leaderboard)
        @Html.HiddenFor(m => m.TreasureHuntId)
        etc.

我看不出 TreasureHuntId 变量有什么特别之处,因为它是唯一一个其值是到达控制器的对象上唯一填充的变量。有任何想法吗?我可能做错了什么?

当我仅使用数据模型(TreasureHuntDetails)以正常方式调用控制器时,所有内容都会正确填充,因此它仅在我还在 Ids 数组上添加的 javascript 中(javascript 代码片段中的 'positions' 变量是一个整数数组)。

4

3 回答 3

2

你实际上并没有把你的模型传回去。ID 存在的原因可能是因为它已经在 HttpGet 请求的 url 中。

首先,将您的网址更改为没有模型:

url: "@Url.Action("ReorderClues", "Clues")",

然后更改您的 ajax 方法以将模型也传回:

data: { treasureHuntDetails: $("form").serialize(), ids: JSON.stringify(positions) }
于 2013-04-24T22:30:37.177 回答
1

这对我有用,我在下面留下了原始帖子:

$.ajax({
  type: 'POST',
  contentType: 'application/json',
  url: '@Url.Action("Contact", "Home")',
  data: JSON.stringify({
    completionMessage: $("#CompletionMessage").val(),
    description: $("#Description").val(),
    clues: $("#Clues").val(),
    leaderboard: $("#Leaderboard").val(),
    treasureHuntId: $("#TreasureHuntId").val(),
    ids: positions
  })
});

您需要从 Url.Action() 中删除“模型”,当然还需要将我的示例中的值更改为您正在使用的操作和控制器名称。为了清楚起见,我包含了“位置”变量,您的值将来自此闭包之外。

--- 原始答案 ---

您需要在为 AJAX 调用传递的数据中包含所有隐藏值。您所写的内容与您所写的一样有效,但不会包含您页面中的其他表单值。如果我不得不猜测,如果 TreasureHuntId 是一个整数,那么它会填充数组中来自位置变量的第一个值。您可能想要做的是将 Fiddler 放入并查看发布的内容。

在浏览器中查看您的 URL 的来源。与您的预期相比,这可能会让您感到惊讶。您是否依赖于默认路由?检查您是否在控制器中为此操作制定了任何特殊路线。

我认为最好的方法是手动创建对象:AJAX 上的 jQuery 文档指定数据设置是序列化查询字符串或对象。如果您使用对象,那么您可能希望将 dataType 更改为“json”,您不需要 contentType。

data: {
  CompletionMessage: $('#CompletionMessage').val(),
  Description:  $('#Description').val(),
  // other fields here...
  ids: JSON.stringify(positions)
}

请注意,如果无法识别方法,您可能需要/想要更改控制器上的签名以接受单个参数与 TreasureHuntDetails 类。

或者,查看 jQuery 中的 serialize() 函数 - $.post()上的文档将帮助您找到解决方案。请记住,如果您走这条路线,那么您需要远程 contentType,因为它默认为正确的表单 MIME 类型。

于 2013-04-24T22:17:43.870 回答
0

I had the situation earlier this year where it was because my jQuery variable name was not the same as my actionresult parameter name. Don't ask why, but that was the problem for me.

于 2013-04-25T07:53:45.843 回答