将 JSON 字符串发送到 MVC 控制器失败

Posted

技术标签:

【中文标题】将 JSON 字符串发送到 MVC 控制器失败【英文标题】:Sending JSON string to MVC controller fails 【发布时间】:2017-04-25 01:32:54 【问题描述】:

我正在使用 VS2015、C# 并尝试将 JSON 数组传递给 MVC 控制器。

我尝试发送的 JSON 字符串是(我已经检查过它是有效的 JSON):

["iUSER_KEY":"130000096","iUSNW_KEY":"160001926","iUSER_KEY":"160000209","iUSNW_KEY":"160001779"]

我收到的错误是:

[ArgumentException:无效的 JSON 原语:keysList。]

在客户端我的代码是:

$('.do-remove').click(function (e) 

      e.preventDefault();

  var keys = [];
  $("#tableUSNW tbody tr").each(function () 

    var row = $(this);
    var checked = $(row).find("td > input[id=inputChk]").is(":checked");

    if (checked === true) 

      var iUSER_KEY = $(row).attr("data-userkey");
      var iUSNW_KEY = $(row).attr("data-ref");
      var user = iUSER_KEY: iUSER_KEY, iUSNW_KEY: iUSNW_KEY;
      keys.push(user);

      row.remove();
    
  );

  keys = JSON.stringify(keys);

  $.ajax(
    type: "POST",
    url: '/newsinternal/UpdateUsnwRemove',
    traditional: true,
    contentType: "application/json; charset=utf-8",
    data:  keysList: keys ,
    beforeSend: function () 
      $('#loader').show();
    ,
    success: function (msg) 
      $('#loader').hide();          
    ,
    error: function (xhr, ajaxOptions, thrownError) 
      $('#loader').hide();
      alert(xhr.responseText);
    
  );
);

在服务器上(MVC 控制器方法):

[HttpPost]
public void UpdateUsnwRemove(List<DTO_CAUSNW> keysList)

  using (iDatabase baza = new iDatabase(iPUURE.Web.Configuration.GetConnectionString()))
  
    CommDB db = new CommDB(baza, false);
    foreach (var item in keysList)
    
      DTO_CAUSNW usnw = new DTO_CAUSNW();          
      usnw.cUSNW_STA = "9";
      iQuery qDelete = db.LoadInsertCAUSNW_BASE(usnw, "4");  // 1 = select, 2 = insert, 3 = update 4 = delete
    
  

还有 DTO_CAUSNW 类:

public class DTO_CAUSNW

    public int? iUSNW_KEY  get; set;  //user_news key 
    public string cUSNW_STA  get; set;  //status: 1=enable, 2/null=disable, 9=erased 
    public string cUSNW_SRT  get; set;  //sort: 1=internal news
    public DateTime? dUSNW_DAT  get; set;  //date of changed status

    public int? iNEWS_KEY  get; set;  //news key
    public int? iUSER_KEY  get; set;  //user key 

    public DateTime? dUSNW_DSI  get; set;  //time of signature
    public DateTime? dUSNW_DAU  get; set;  //time of user changed  
    public string cUSNW_STU  get; set;  //user status: 1=confirm, 2/null=not confirm
    public int? iUSNW_CPU  get; set;  //counter of postponed
    public string cUSNW_COM  get; set;  //comment
    public string cUSNW_NTO  get; set;  //note

    public DTO_CANEWS oNEWS  get; set;  //the news
    public DTO_BAUSER oUSER  get; set;  //the user

【问题讨论】:

将变量 keys 更改为 keysList... 并在 ajax 调用中设置数据:keysList 【参考方案1】:

当您在 ajax 帖子中发送 data: keysList: keys 时,这意味着服务器必须有一个带有 keyslist 属性的对象。

只需将data: keysList: keys 更改为data: keys

【讨论】:

感谢您的回答。是否可以添加一些其他参数,比如说在方法调用中再添加两个整数? @FrenkyB 你的意思是像UpdateUsnwRemove(List&lt;DTO_CAUSNW&gt; keysList,int param1,int param2) 是的,就像那样。 @FrenkyB 当然可以。比你的 data 会像 data: keysList: keys, param1:1, param2:2 但记住参数名称在这种情况下很重要并且区分大小写【参考方案2】:

创建你的有效载荷

$('.do-remove').click(function (e) 

  e.preventDefault();

  var keys = [];
  $("#tableUSNW tbody tr").each(function () 

    var row = $(this);
    var checked = $(row).find("td > input[id=inputChk]").is(":checked");

    if (checked === true) 

      var iUSER_KEY = $(row).attr("data-userkey");
      var iUSNW_KEY = $(row).attr("data-ref");
      var user = iUSER_KEY: iUSER_KEY, iUSNW_KEY: iUSNW_KEY;
      keys.push(user);

      row.remove();
    
  );


  var model =  keysList: keys ;
  //..other code

并在 ajax 中对整个事情进行字符串化。

...
data: JSON.stringify(model),
...

【讨论】:

感谢您的回答。如果有多个参数,比如说另外两个整数呢? 在创建有效负载时包含它们。 var model = keysList: keys, param1: 1, param2: 2 ; 您应该考虑更新操作以采用具有参数作为属性的复杂对象模型,因为您只能使用请求正文中的一个参数

以上是关于将 JSON 字符串发送到 MVC 控制器失败的主要内容,如果未能解决你的问题,请参考以下文章

在mvc中,使用summernote编辑器,我想将内容字符串和html的数据发送到控制器

通过 JSON 将数组发送到 MVC 控制器?

将 JSON 从视图发送到控制器 ASP.NET MVC 会给出空值

MVC 控制器返回内容与返回 Json Ajax

将json发送到控制器时,ASP.NET mvc 4控制器参数始终为空,为啥?

无法将 JSON 数据发送到 asp.net MVC 控制器中的另一个操作