我正在尝试使用JQuery AJAX调用包含复杂对象参数的控制器动作方法。
我已经阅读了很多博客并尝试了从中学到的几种技术。 我构建的最佳尝试代码(如下)的关键帖子是stackoverflow帖子here。
我想触发异步发布,当用户在一个字段上切换时调用它[不是表单保存发布 - 如其他示例所示]。
我的意图是:
- 在客户端上实例化一个对象[而不是为视图提供类型的ViewModel];
- 从视图中的几个字段中填充对象;
- 将此对象转换为JSON;
- 使用jQuery.Ajax方法调用控制器操作方法,传递JSON对象。
结果将作为JSON结果返回; 根据返回的结果,数据将加载到视图中的字段中。
问题是:
- 如果操作方法带有HttpPost属性,则不会调用控制器Action方法(即使将AJAX调用类型设置为“POST”)。
- 如果操作方法带有HttpGet,则参数的属性值为null。
- ReadObject方法会抛出错误:“Expecting element 'root' from namespace''.. Encountered 'None' with name 'namespace'”。
希望有人可以帮忙。 以下是代码:
客户端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);
}
{InvoiceNumber:
而不是{"Invoice Number":
,我猜这是问题的一部分。 - Mattygabe