JQuery Ajax和ASP.NET MVC3导致null参数

这个问题已被多次询问,但我找到的解决方案似乎都没有起作用。 让我觉得这可能是一个新问题,也许是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"); } }); 

没有工作。 如果我只有一个字符串,我传递给控制器​​,这是有效的。 但是一旦我介绍了一个对象,我就无法让它工作。

任何人都知道可能是什么问题。

非常感谢您对此进行调查!

你的代码似乎很好,它应该工作。 我刚刚在新应用程序中测试了以下内容而没有任何问题。

模型:

 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 }); } } 

视图:

  

您好您需要的是ValueProvider。

您可以在这里和这里阅读有关ValueProviders的信息 。

此ValueProvider使用默认的JavaScriptSerializer选取已发布的Json并填充Action方法参数

 ValueProviderFactories.Factories.Add(new JsonValueProviderFactory()); 

您可以在Global.asax.cs中添加该行,以便在Application start时执行一次。 您刚刚告诉默认的Model Binder将传入的Json绑定到Models。 在内部,JsonValueProvider只是一个字典值提供程序,如UrlValueProvider,只有它根据你发布的Json构造字典。 MVC团队的一个巧妙的实施。 GJ MVC团队。

感谢您上面的回复,但示例不太正确。 以下是客户端代码的外观:

  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中的错误function仅在传输过程中生成错误时出现,或者在服务器上生成错误时出现。

服务器应该处理上述请求的方式如下(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 }); } 

谢谢,

番茄

对我来说,这听起来像字符串中的字符是问题,尝试传递一个包含以下字符的简单字符串

 {[,:"']} 

我认为这也会失败,只是删除字符直到它通过