将字符串数组发布到 .net-core mvc
Posted
技术标签:
【中文标题】将字符串数组发布到 .net-core mvc【英文标题】:Posting array of strings to .net-core mvc 【发布时间】:2018-09-20 03:17:55 【问题描述】:问题:
我正在尝试通过 jquery post 发送一个字符串数组,但它们没有被正确解析,我得到的只是列表中的空值。
var array = [];
array.push("test")
array.push("test2")
array.push("tes3")
$.post("Admin/FilteredKeys", $.param(JSON.stringify( Ids: array, OnlyActive: true , true)));
C# 模型:
public class MySearch
public bool OnlyActive get; set; = true;
public List<string> Ids get; set;
控制器中的操作:
public async Task<IActionResult> FilteredKeys(MySearch filter)
var data = await _service.GetFilteredKeyTypes(filter);
return View();
我用谷歌搜索,发现传统属性需要设置为 true,但它保持不变,我也尝试了这个 sn-p:
$.ajax(
type: "POST",
url: "Admin/FilteredKeys",
data: postData,
success: function(data)
alert(data.Result);
,
dataType: "json",
traditional: true
);
这是一个 .net 核心项目,我需要在某处更改其他参数吗?
编辑:
忘了补充一下,我最初的尝试是这样的:
$.Admin.worker.postJson("Admin/FilteredKeys", JSON.stringify( Ids: array, OnlyActive: true ), function (data)
var t = "";
);
postJson: function (url, data, callback)
$.LoadingOverlay("show");
$.ajax(
url: url,
type: 'POST',
data: data,
contentType: 'application/json; charset=utf-8',
success: function (data)
if (callback)
callback(data);
$.LoadingOverlay("hide");
,
error: function (event, jqxhr, settings, thrownError)
//$.helpers.errorHandler($("#fileDialogErrors"), event.responseText);
$.LoadingOverlay("hide");
);
【问题讨论】:
没有对其进行测试,但我建议在 ajax 中使用data: filter : postData
,因为我遇到并解决了类似的问题。
我偷偷摸摸的怀疑与您参数化字符串对象的位置有关:$.param(JSON.stringify( Ids: array, OnlyActive: true
。您是否只是尝试将对象本身作为发布数据发布?例如 Ids: array, OnlyActive: true
【参考方案1】:
因为我认为接受的答案是不正确的 - 这里是另一种选择(类似,但与此处的其他答案不同)。首先你需要用FromBody
属性装饰模型:
public async Task<IActionResult> FilteredKeys([FromBody] MySearch filter)
var data = await _service.GetFilteredKeyTypes(filter);
return View();
ajax 调用应该是这样的:
var array = [];
array.push("test")
array.push("test2")
array.push("test3")
$.ajax(
type: "POST",
url: "Admin/FilteredKeys",
data: JSON.stringify( Ids: array, OnlyActive: true),
contentType: "application/json; charset=utf-8",
success: function(data)
// ...
,
failure: function(errMsg)
// ...
);
【讨论】:
【参考方案2】:为什么不这样:
$.post("Admin/FilteredKeys", Ids: JSON.stringify(array), OnlyActive: true );
【讨论】:
我也是这么想的,Manoj :) 我要说的是,如果你稍微解释一下你的答案,可能会对每个人都有好处。 @Keith - 我知道。也许我不清楚。我的意思是,如果解释了为什么现有代码不起作用,以及这有何不同,这将使所有用户的答案更加完整和易于理解。 它将整个数组字符串化为一个字符串。所以,不需要JSON.stringify(array)
,只需Ids: array
。
@Manoj 我投了反对票,因为您的解决方案将返回到控制器非空对象,但对于 Ids
列表,它将获得一个项目,其中包含实际数组的 json 序列化字符串,而我没有不认为这是一个正确的解决方案。
@SeM - 同样的原因我还没有投票。我认为投反对票是不公平的——至少答案是正确的。但是,我同意:这个答案需要简单地将array
作为Ids
的值传递,而不是对其进行序列化,这使得它还不完全正确。【参考方案3】:
这个答案是为了替代(如果有人更喜欢这个解决方案):
$.post("Admin/FilteredKeys", Ids: array, OnlyActive: true );
【讨论】:
【参考方案4】:确保控制器尝试从主体中解析模型,您可以添加 FromBody 属性:
public async Task<IActionResult> FilteredKeys([FromBody] MySearch filter)
...
您还应该在请求中添加 application/json 内容类型:
$.ajax(
type: "POST",
url: ...,
data: ...,
success: ...
contentType: "application/json"
);
【讨论】:
【参考方案5】: $.ajax(
type: "POST",
url: "Admin/FilteredKeys",
data: filter: postData,
success: function(data)
alert(data.Result);
,
dataType: "json",
traditional: true
);
【讨论】:
一般来说,如果答案包含对代码的用途的解释,以及为什么在不介绍其他人的情况下解决问题的原因,答案会更有帮助。 @LonelyNeuron 谢谢你的建议。以上是关于将字符串数组发布到 .net-core mvc的主要内容,如果未能解决你的问题,请参考以下文章
如何在没有表单的情况下将字符串数组发布到 ASP.NET MVC 控制器?
在 Spring MVC 中使用 curl 将字符串值数组作为请求正文发布