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中工作的信息的变通方法。
- 无法读取未定义的属性“协议”
- AJAX POST和加号(+) – 如何编码?
- jquery / Ajax表单提交(enctype =“multipart / form-data”)。 为什么'contentType:False'在PHP中导致未定义的索引?
- HTTP状态码0是否有任何意义?
- 使用jquery / ajax刷新/重新加载Div中的内容
- 如何设置jquery select2的选定值?
- jQuery ajax成功匿名函数的作用域
- 使用Ajax XmlHttpRequest上传文件
- 有可能通过一些debugging器,如WebKit,FireBug或IE8开发工具debuggingdynamic加载JavaScript?