将 JSON 添加到控制器中的列表
本文关键字:列表 控制器 JSON 添加 | 更新日期: 2023-09-27 18:31:22
我看到很多帖子似乎在某种程度上解决了我的情况,但它们都让我有点困惑。
我有一个对象,我正在向我的控制器POST
。我通过这样做可以将帖子发送到我的控制器:
$('#fileSubmit').click(function () {
var filesObj = [];
$('#fileList .files .fileName').each(function () {
var name = $(this).text();
filesObj.push({ 'name': name });
});
$.ajax({
type: "POST",
url: "/FileUpload/ImportCommit",
data: filesObj,
dataType: "json"
});
});
然后,我想获取该 JSON 对象并将其放入控制器中的列表中。到目前为止,这就是我所拥有的,但我还没有用 C# 做很多编码,也不知道下一步该做什么。
[HttpPost]
public ActionResult ImportCommit(List<string> filenames)
{
}
我知道我的控制器方法的代码是空白的,但不确定下一步该怎么做。任何帮助将不胜感激。谢谢!
通过 ajax 方法的数据字段发送的发布数据必须是名称值对。 Asp.Net 将通过它们的名称在请求参数集合中映射它们。例如,如果您发布这样的对象,
{
fileNames: JSON.stringify(arFileNames)
};
然后可以通过以下方式访问服务器端,
string json = HttpContext.Current.Request.Params["fileNames"];
如果你的 json 看起来像这样,
"{"filenames":["somefile","somefile2","somefile3"]}"
您可以使用Newtonsoft JSON(JSON.Net)通过创建一个类来表示它,将其转换为字符串列表,如下所示:
public class JsonResultFileNames
{
[Newtonsoft.Json.JsonProperty(PropertyName = "filenames")]
public string[] FileNames { get; set; }
}
然后将 json 转换为 JsonResultFileNames,
JsonResultFileNames jsonResult = Newtonsoft.Json.JsonConvert.DeserializeObject<JsonResultFileNames>(jsonStringHere);
然后,你有一个表示 json 数据的 c# 对象。 你也可以变得更复杂,但 JSON.Net 要注意的重要一点是,它实际上是反序列化为 c# 表示形式。 例如,如果你想直接反序列化为字符串数组,那么你的json中应该只有一个字符串数组(没有对象/字段名称等)。
例如,在我工作的地方,我们有一个返回如下结果的 api,
{ 状态:{ 成功:真实; }, 客户数据 { id: {some-guid}, 名称:某个客户名称 } }
问题是我的 C# 类需要由嵌套类组成,例如,我需要一个类来表示状态,需要一个类来表示客户数据。 这样做时,事情可能会变得很奇怪,我最终得到了像CustomerResponse,CustomerResponseStatus,CustomerResponseData这样的东西,其中CustomerResponseStatus和CustomerResponseData在CustomerRespnose中公开,我将json反序列化为CustomerResponse类型。
如果你的 json 只是一个字符串数组,你应该能够对传递给 JsonConvert.Deserialize 的类型使用 string[],这不需要你创建响应类来保存数据。
窍是将我的AJAX
修改为如下所示POST
:
$.ajax({
type: "POST",
url: "/dat/Controller",
data: JSON.stringify(filesObj),
contentType: "application/json",
traditional: true,
success: function (result) {
console.log("Success: " + result);
},
error: function (result) {
console.log("Error: " + result);
}
});
将dataType
更改为contentType
并添加traditional: true
似乎对我有用。这样做的原因(我相信)是因为我发布的实际数据在技术上并不JSON
。为了安全起见,我添加了traditional: true
。