将 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)
{
}

我知道我的控制器方法的代码是空白的,但不确定下一步该怎么做。任何帮助将不胜感激。谢谢!

将 JSON 添加到控制器中的列表

通过 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