在我的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'变量)代码片段是一个整数数组)。
答案 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参数名不同。不要问为什么,但这对我来说是个问题。