加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc – MVC ajax json post到控制器动作方法

发布时间:2020-12-15 19:02:25 所属栏目:asp.Net 来源:网络整理
导读:我试图实现一个JQuery AJAX调用控制器动作方法,其中包含一个复杂的对象作为参数。 我已经阅读了大量的博客,并尝试了从这些学到的几种技术。我构建了我最好的尝试代码(下面)的关键post是stackoverflow post here 。 我想触发一个异步发布,当用户关闭一个字
我试图实现一个JQuery AJAX调用控制器动作方法,其中包含一个复杂的对象作为参数。
我已经阅读了大量的博客,并尝试了从这些学到的几种技术。我构建了我最好的尝试代码(下面)的关键post是stackoverflow post here 。

我想触发一个异步发布,当用户关闭一个字段时调用[不是一个Form保存帖子 – 如我在其他示例中所示)。

我的目的是:

>实例化客户端上的对象(而不是ViewModel,它提供了View的类型);
>使用视图中多个字段的数据填充对象;
>将此对象转换为JSON;
>使用jQuery.Ajax方法调用控制器动作方法,传递JSON对象。

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

问题是:

>如果action方法属于HttpPost属性,则不会调用控制器Action方法(即使AJAX调用类型设置为“POST”)。
>如果action方法是使用HttpGet归因的,那么参数的属性值为null
> ReadObject方法抛出错误:“期望元素’root’从命名空间”..遇到’无’与名称’命名空间’”。

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

客户端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方法参数关联的类型的过滤器和类

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

解决方法

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

关键点是:
我需要使用与视图相关联的ViewModel,以便运行时能够解析请求中的对象。

[我知道有一种方法绑定一个对象而不是默认的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),contentType: 'application/json; charset=utf-8',error: function (xhr) {
            alert('Error: ' + xhr.statusText);
         },success: function (result) {
            CheckIfInvoiceFound(result);
         },async: true,processData: false
      });

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读