这是我的控制器:
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);
但是,当我调试控制器动作时,除了每个Tag对象中的ID值外,我发现一切都在那里。
因此,我的'model'参数如下所示:
model
GroupID 12
Tags
Tag
ID 0
Tag
ID 0
这是为什么?我需要做什么才能使ASP.NET MVC正确绑定我的ID值?
(注意:我正在做的事情与this几乎完全相同。那为什么它对我不起作用?)
答案 0 :(得分:3)
ASP.NET MVC 3有一个内置的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请求标头,以便服务器知道我们正在发送JSON请求。
JSON.stringify
是一种将javascript文字序列化为JSON字符串的方法。此方法本身内置于现代浏览器中,但如果您需要支持旧版浏览器,则可以在页面中加入json2.js脚本。
答案 1 :(得分:2)
经过进一步检查,由于'$ .post'使用的jQuery JSON处理器与ASP.NET MVC中的DefaultModelBinder之间基本不兼容,似乎无法实现这一点。
基本上,如果我使用以下数据模拟fiddler中的帖子(当然也可以序列化它),我可以让模型绑定工作:
SearchTagID=1&ApplicationType=0&Items[0].ID=2&Items[1].ID=672
请注意,它使用'dot'表示法,例如:Items [0] .ID = 2。
jQuery代码使用'square-bracket'表示法,如下所示:
SearchTagID=1&ApplicationType=0&Items[0][ID]=2&Items[1][ID]=672
因此,除非有办法让jQuery使用点符号,否则我想我必须弄清楚某种解决方法。