这个问题已被多次询问,但我找到的解决方案似乎都没有起作用。让我觉得这可能是一个新问题,也许是ASP.NET MVC 3特有的东西。
我正在使用JQuery Ajax对ASP.NET MVC 3控制器进行简单调用。像这样
var addressInfo = {
Address1: "423 Judy Road",
Address2: "1001",
City: "New York",
State: "NY",
ZipCode: "10301",
Country: "USA"
};
$.ajax({
url: '/home/check',
type: 'POST',
data: JSON.stringify(addressInfo),
dataType: 'json',
contentType: 'application/json; charset=utf-8',
success: function () {
alert("success");
},
error: function () {
alert("error");
}
});
控制器看起来像这样
[HttpPost]
public ActionResult Check(AddressInfo addressInfo)
{
// Do something and return Json(something)
}
这不起作用,但它应该基于Scottgu的post
的“JavaScript和AJAX改进”部分我尝试了很多不同的变体,例如:
var args = new Object();
args.addressInfo = {
Address1: "423 Judy Road",
Address2: "1001",
City: "New York",
State: "NY",
ZipCode: "10301",
Country: "USA"
};
$.ajax({
url: '/home/check',
type: 'POST',
data: JSON.stringify(args),
dataType: 'json',
contentType: 'application/json; charset=utf-8',
success: function () {
alert("success");
},
error: function () {
alert("error");
}
});
然后以上两个都直接使用JSON对象:
$.ajax({
url: '/home/check',
type: 'POST',
data: args,
success: function () {
alert("success");
},
error: function () {
alert("error");
}
});
没有工作。如果我只有一个字符串,我传递给控制器,这是有效的。但是一旦我介绍了一个对象,我就无法让它工作。
任何人都知道可能是什么问题。
非常感谢您对此进行调查!
答案 0 :(得分:4)
您的代码似乎很好,它应该工作。我刚刚在新应用程序中测试了以下内容而没有任何问题。
型号:
public class AddressInfo
{
public string Address1 { get; set; }
public string Address2 { get; set; }
public string City { get; set; }
public string State { get; set; }
public string ZipCode { get; set; }
public string Country { get; set; }
}
控制器:
public class HomeController : Controller
{
public ActionResult Index()
{
return View();
}
[HttpPost]
public ActionResult Check(AddressInfo addressInfo)
{
return Json(new { success = true });
}
}
查看:
<script type="text/javascript">
var ai = {
Address1: "423 Judy Road",
Address2: "1001",
City: "New York",
State: "NY",
ZipCode: "10301",
Country: "USA"
};
$.ajax({
url: '/home/check',
type: 'POST',
data: JSON.stringify(ai),
contentType: 'application/json; charset=utf-8',
success: function (data) {
alert(data.success);
},
error: function () {
alert("error");
}
});
</script>
答案 1 :(得分:1)
您需要的是ValueProvider。
您可以阅读有关ValueProviders here和here的信息。
此ValueProvider使用默认的JavaScriptSerializer
选取已发布的Json并填充Action方法参数ValueProviderFactories.Factories.Add(new JsonValueProviderFactory());
您可以在Global.asax.cs中添加该行,以便在应用程序启动时执行一次。您刚刚告诉默认的Model Binder将传入的Json绑定到Models。在内部,JsonValueProvider只是一个字典值提供者,比如UrlValueProvider,只有它根据你发布的Json构造字典。 MVC团队的一个巧妙的实现。 GJ MVC团队。
答案 2 :(得分:1)
感谢您上面的回复,但示例不太正确。以下是客户端代码的外观:
jQuery.ajax({
url: '/Blogs/Update',
type: "POST",
data: JSON.stringify(blog),
dataType: "json",
contentType: "application/json; charset=utf-8",
success: function (d) {
if(d.success == true)
jQuery('#status').html('Blog saved');
else
jQuery('#status').html('The server had some issues with the data');
},
error: function () {
jQuery('#status').html('Ajax error occurred during the transmission.');
}
});
如您所见,success函数需要一个对象而不是一个方法,因此前一个响应中的代码会产生语法错误。上面的请求可以成功通过ajax但仍然在服务器上生成错误。 ajax中的错误功能仅在传输过程中生成错误时出现,或者在服务器上生成错误时出现。
服务器应该处理上述请求的方式如下(asp.net MVC 2或3):
[Transaction]
[HttpPost]
public ActionResult Update(Blog blog)
{
if (ModelState.IsValid && blog.IsValid())
{
this.blogRepository.SaveOrUpdate(blog);
return Json(new { success = true });
}
return Json(new { success = false });
}
谢谢,
番茄
答案 3 :(得分:0)
对我来说,这听起来像字符串中的字符是问题,尝试传递一个包含以下字符的简单字符串
{[,:"']}
我认为这也会失败,只是删除字符直到它通过