MVC AJAX JSON发布到控制器的操作方法

我正在试图实现一个控制器的操作方法,包含一个复杂的对象作为参数的JQuery AJAX调用。 我已经阅读了大量的博客,并尝试了从这些中学到的一些技巧。 我已经构build了我最好的尝试代码(下)的关键post是这里的计算器贴子。

我想触发一个asynchronous的post,当用户select一个字段[不是一个表单保存post – 如我已经find的其他示例中所示]时调用。

我的意图是:

  • 在客户端实例化一个对象[不是提供视图types的ViewModel];
  • 使用视图中几个字段的数据填充对象;
  • 将此对象转换为JSON;
  • 使用jQuery.Ajax方法调用controller的action方法,传递JSON对象。

结果将作为JSON结果返回; 数据将根据返回的结果加载到视图中的字段中。

问题是:

  • 如果操作方法由HttpPost属性赋值,则不会调用控制器的Action方法(即使AJAX调用types设置为“POST”)。
  • 如果操作方法使用HttpGet,则参数的属性值为null
  • ReadObject方法抛出错误:“从命名空间'Expecting元素'根''..遇到'None'名称'命名空间'”。

希望有人能帮助。 谢谢。 代码如下:

客户端js文件

var disputeKeyDataObj = { "InvoiceNumber": "" + $.trim(this.value) + "", "CustomerNumber": "" + $.trim($('#CustomerNumber').val()) + "" }; var disputeKeyDataJSON = JSON.stringify(disputeHeadlineData); $.ajax({ url: "/cnr/GetDataForInvoiceNumber", type: "POST", data: disputeKeyDataJSON, dataType: 'json', contentType: "application/json; charset=utf-8", success: EnrichedDisputeKeyData(result) }); 

Action与Action方法参数关联的types的filter和类

  [DataContract] public class DisputeKeyData { [DataMember(Name = "InvoiceNumber")] public string InvoiceNumber { get; set; } [DataMember(Name = "CustomerNumber")] public string CustomerNumber { get; set; } } 

控制器上的Action方法

  //[HttpPost] [ObjectFilter(Param = "disputeKeyData", RootType = typeof(DisputeKeyData))] public ActionResult GetDataForInvoiceNumber(DisputeKeyData disputeKeyData) { //Blah! //.... return Json(disputeKeyData, JsonRequestBehavior.AllowGet); } 

以下是我如何得到这个工作。

关键在于:我需要使用与视图关联的ViewModel,以便运行时能够parsing请求中的对象。

[我知道,有一种方法来绑定一个对象,而不是默认的ViewModel对象,但最终只是为我的需要填充必要的属性,因为我不能让它工作]

 [HttpPost] public ActionResult GetDataForInvoiceNumber(MyViewModel myViewModel) { var invoiceNumberQueryResult = _viewModelBuilder.HydrateMyViewModelGivenInvoiceDetail(myViewModel.InvoiceNumber, myViewModel.SelectedCompanyCode); return Json(invoiceNumberQueryResult, JsonRequestBehavior.DenyGet); } 

用于调用此操作方法的JQuery脚本:

 var requestData = { InvoiceNumber: $.trim(this.value), SelectedCompanyCode: $.trim($('#SelectedCompanyCode').val()) }; $.ajax({ url: '/en/myController/GetDataForInvoiceNumber', type: 'POST', data: JSON.stringify(requestData), dataType: 'json', contentType: 'application/json; charset=utf-8', error: function (xhr) { alert('Error: ' + xhr.statusText); }, success: function (result) { CheckIfInvoiceFound(result); }, async: true, processData: false }); 

这篇博客文章直接解决您的问题。

它使用的技术不需要额外的JSON客户端库。 它介绍了一个非常简单的jQuery插件,可以帮助你做到这一点。

你使用的是什么版本的asp.net mvc? 将json对象发布到刚刚添加到ASP.NET MVC 3 Beta 1中的强types控制器操作中。本文解释了使用asp.net mvc 2的模型绑定器以及如何在MVC 3中工作的信息的变通方法。