这是我的控制器:
public class TagsController : Controller
{
public ActionResult Attach(TagsAttach model)
{
// ...
}
}以下是我的视图模型:
public class TagsAttach
{
public int GroupID { get; set; }
public List<Tag> Tags { get; set; }
}
public class Tag
{
public int ID { get; set; }
}下面是我用来提交数据的Javascript代码:
var data = {
GroupID: 12,
Tags: []
};
data.Tags.push({ ID: 3 });
data.Tags.push({ ID: 4 });
$.push('/Tags/Attach', data);但是,当我调试我的控制器操作时,我发现除了每个标记对象中的ID值之外,所有东西都在那里。
因此,我的'model‘参数如下所示:
model
GroupID 12
Tags
Tag
ID 0
Tag
ID 0为什么会这样呢?要让ASP.NET MVC正确绑定我的ID值,我需要做些什么?
(注意:我正在做的事情看起来和this几乎完全一样。那么为什么它对我不起作用呢?)
发布于 2011-11-06 18:52:16
JSONMVC3有一个内置的JsonValueProviderFactory,它允许您将JSON请求发送到控制器操作,默认的模型绑定器将能够将此JSON字符串转换为相应的视图模型。您可以像这样使用$.ajax方法:
var dataToSend = {
// model is the name of the action parameter
// this nesting could be omitted
model: {
GroupID: 12,
Tags: [ { ID: 3 }, { ID: 4 } ]
}
};
// the following will also work but assumes that you have a single
// action argument. And since your actions should take only the view model
// as action argument it is also a good way:
// var dataToSend = { GroupID: 12, Tags: [ { ID: 3 }, { ID: 4 } ] };
$.ajax({
url: '@Url.Action("Attach", "Tags")',
type: 'POST',
contentType: 'application/json; charset=utf-8',
data: JSON.stringify(dataToSend),
success: function(result) {
alert('success');
}
});这允许您向控制器操作发送任意复杂的javascript文字。
重要说明:
contentType: 'application/json; charset=utf-8'设置Content-Type请求报头,以便服务器知道我们正在发送request.JSON.stringify,它是一个将javascript文字序列化为JSON字符串的方法。此方法本机内置于现代浏览器中,但如果您需要支持传统浏览器,则可以在页面中包含json2.js脚本。发布于 2011-11-06 15:39:40
经过进一步检查,这似乎是不可能的,因为“$.post”使用的jQuery JSON处理器与ASP.NET MVC中的DefaultModelBinder之间存在基本不兼容。
基本上,如果我用下面的数据在fiddler中模拟一个post (当然,还要序列化它),我就可以让模型绑定工作起来:
SearchTagID=1&ApplicationType=0&Items[0].ID=2&Items[1].ID=672注意,它使用的是‘点’符号,例如: Items.ID=2。
jQuery代码使用“方括号”表示法,如下所示:
SearchTagID=1&ApplicationType=0&Items[0][ID]=2&Items[1][ID]=672因此,除非有办法让jQuery改用点符号,否则我想我必须想出一些变通办法。
https://stackoverflow.com/questions/8025734
复制相似问题