我试图实现对包含复杂对象作为参数的控制器操作方法的JQueryAJAX调用。我读了很多博客,并尝试了从中学习到的几种技巧。
我想触发一个异步发布,当用户在某个字段上制表符时调用该异步发布(不是表单保存发布–如我发现的其他示例所示)。
我的意图是:
在客户端上实例化一个对象(不是为View提供类型的ViewModel);
使用视图中多个字段中的数据填充对象;
将此对象转换为JSON;
使用jQuery.Ajax方法调用控制器操作方法,并传递JSON对象。
结果将作为JSON结果返回;并将根据返回的结果将数据加载到视图中的字段中。
问题是:
如果action方法具有HttpPost属性,则不会调用控制器的Action方法(即使AJAX调用类型设置为’POST’)。
如果action方法是HttpGet的属性,则参数的属性值为null
ReadObject方法将引发错误:“从名称空间``。期待元素’root’。遇到名称为’namespace’的’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)
});
与操作方法参数关联的类型的操作过滤器和类
[DataContract]
public class DisputeKeyData
{
[DataMember(Name = "InvoiceNumber")]
public string InvoiceNumber { get; set; }
[DataMember(Name = "CustomerNumber")]
public string CustomerNumber { get; set; }
}
控制器上的动作方法
//[HttpPost]
[ObjectFilter(Param = "disputeKeyData", RootType = typeof(DisputeKeyData))]
public ActionResult GetDataForInvoiceNumber(DisputeKeyData disputeKeyData)
{
//Blah!
//....
return Json(disputeKeyData, JsonRequestBehavior.AllowGet);
}