当前位置: 首页 > 面试题库 >

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

陶宜民
2023-03-14
问题内容

我试图实现对包含复杂对象作为参数的控制器操作方法的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);  
  }

问题答案:

下面是我如何工作的。

关键点是:我需要使用与视图关联的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),
         dataType: 'json',
         contentType: 'application/json; charset=utf-8',
         error: function (xhr) {
            alert('Error: ' + xhr.statusText);
         },
         success: function (result) {
            CheckIfInvoiceFound(result);
         },
         async: true,
         processData: false
      });


 类似资料:
  • 问题内容: 我一直在这里看问题:将MVCajaxjson发布到控制器操作方法,但不幸的是,它似乎并没有帮助我。我的几乎完全相同,除了我的方法签名(但是我已经尝试过了,但仍然没有被击中)。 jQuery的 控制者 但是,无论我尝试什么,我都不会受到打击。通过调试,我知道它发送了一个请求,每次都会得到一个错误。 问题答案: 您的操作需要字符串参数,但是您要发送一个复合对象。 您需要创建一个与您要发送的

  • 概览 触发器配置卡片 此面板配置一些触发器的基本信息,或者进行查阅触发器触发日志等操作。 触发类型目前有两种: 数据表 微信支付回调 条件卡片 对应上面的触发类型,设置不同触发类型的参数。 动作卡片 当触发器的条件被满足,将会执行触发器中的动作。 目前有四种动作类型可选,分别如下: 邮件 微信模板消息 webhook 数据表操作 不同的触发类型对应可选的动作类型不同,每个动作类型又有可选模板变量的

  • 问题内容: 我有一个Ajax POST发送到我的控制器之一。例如 查询>索引。 在Index()动作中,我返回JSON的ActionResult。 在进行登录检查时,我会执行一条if语句,并且如果activeUser的会话令牌为null,我会执行 但是,这不能正确重定向,而是以浏览器抱怨的JSON返回结果。 如何正确设置重定向,以便如果IF语句失败,它将转到登录页面,否则它将返回我需要的JSON结

  • 问题内容: 我在尝试将复杂的JSON对象传递给MVC 4控制器操作时遇到麻烦。由于JSON内容是可变的,因此我不希望MVC将JSON的各个属性/元素映射到action方法的参数列表中的参数。我只想在控制器操作中将数据作为单个JSON字符串参数获取。 这是我的动作方法的签名: 这是我尝试从浏览器发布一些JSON数据的尝试: 当我在ConvertLogInfoToXML方法的开头击中断点时,jsonO

  • 问题内容: 我正在尝试将JSON数组发布到MVC控制器。但是,无论我尝试什么,都为0或null。 我有包含文本框的表。我需要所有这些文本框中的ID和值作为对象。 这是我的Javascript: 这是我的查看代码: 这是控制器即时通讯试图接收数据以: 我究竟做错了什么? 问题答案: 您的代码有很多问题。让我们从标记开始。您有一个表,该表的每一行中都包含隐藏字段。除了您已经对那些隐藏元素的属性进行了硬

  • 空操作 空操作是指系统在找不到指定的操作方法的时候,会定位到空操作(_empty)方法来执行,利用这个机制,我们可以实现错误页面和一些URL的优化。 下面的例子用空操作功能实现了一个城市切换的功能。 我们只需要给City控制器类定义一个_empty (空操作)方法: <?php namespace app\index\controller; class City { public fu