将 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<DTO_CAUSNW> 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 从视图发送到控制器 ASP.NET MVC 会给出空值