从Javascript调用MVC控制器时的空值

时间:2013-04-24 22:06:23

标签: c# jquery asp.net-mvc razor asp.net-mvc-4

在我的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,其他所有内容都为null。第二个参数,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)以正常方式调用控制器时,所有内容都会正确填充,所以它只在javascript中我还添加了Ids数组(javascript中的'positions'变量)代码片段是一个整数数组)。

3 个答案:

答案 0 :(得分:2)

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

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

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

然后更改你的ajax方法以传回模型:

data: { treasureHuntDetails: $("form").serialize(), ids: JSON.stringify(positions) }

答案 1 :(得分: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()中删除“模型”,当然还要将我的示例中的值更改为您正在使用的操作和控制器名称。我已经包含'position'变量只是为了清楚说明,你的价值将来自这个闭包之外。

---原始答案---

您需要在为AJAX调用传递的数据中包含所有隐藏值。你写的内容正如你所写的那样工作,但是你的页面中的附加表单值不会被包括在内。如果我不得不猜测,如果TreasureHuntId是一个整数,那么它将使用位置变量填充数组中的第一个值。你可能想做的就是把Fiddler放进去看看发布的内容。

在浏览器中查看您的网址源代码。与您期望的相比,它可能让您感到惊讶。您是否依赖于默认路线?检查您是否在控制器中为此操作制定了任何特殊路线。

我认为最好的方法是手动创建对象: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类型。

答案 2 :(得分:0)

我今年早些时候遇到过这种情况,因为我的jQuery变量名与我的actionresult参数名不同。不要问为什么,但这对我来说是个问题。