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

C# 将JSON添加到我的控制器中的列表,c#,asp.net-mvc,json,post,C#,Asp.net Mvc,Json,Post,我看到很多帖子似乎在某种程度上解决了我的情况,但它们都让我有点困惑 我有一个对象,我正在POSTing到我的控制器。通过这样做,我可以将帖子发送给我的控制器: $('#fileSubmit').click(function () { var filesObj = []; $('#fileList .files .fileName').each(function () { var name = $(this).text(); filesObj.pu

我看到很多帖子似乎在某种程度上解决了我的情况,但它们都让我有点困惑

我有一个对象,我正在
POST
ing到我的控制器。通过这样做,我可以将帖子发送给我的控制器:

$('#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)
{

}
[HttpPost]
公共操作结果导入提交(列出文件名)
{
}

我知道我的控制器方法的代码为空,但不确定下一步要做什么。任何帮助都将不胜感激。谢谢

通过ajax方法的数据字段发送的post数据需要是名称-值对。Asp.Net将通过它们的名称将它们映射到请求参数集合中。例如,如果您发布这样的对象

{
    fileNames: JSON.stringify(arFileNames)
};
"{"filenames":["somefile","somefile2","somefile3"]}"
public class JsonResultFileNames 
{
    [Newtonsoft.Json.JsonProperty(PropertyName = "filenames")]
    public string[] FileNames { get; set; }        
}
然后可以通过以下方式访问服务器端:

string json = HttpContext.Current.Request.Params["fileNames"];
如果您的json看起来像这样

{
    fileNames: JSON.stringify(arFileNames)
};
"{"filenames":["somefile","somefile2","somefile3"]}"
public class JsonResultFileNames 
{
    [Newtonsoft.Json.JsonProperty(PropertyName = "filenames")]
    public string[] FileNames { get; set; }        
}
您可以使用newtonsoft JSON()通过创建一个类来表示它,将其转换为字符串列表,如下所示

{
    fileNames: JSON.stringify(arFileNames)
};
"{"filenames":["somefile","somefile2","somefile3"]}"
public class JsonResultFileNames 
{
    [Newtonsoft.Json.JsonProperty(PropertyName = "filenames")]
    public string[] FileNames { get; set; }        
}
然后将json转换为JsonResultFileNames

JsonResultFileNames jsonResult = Newtonsoft.Json.JsonConvert.DeserializeObject<JsonResultFileNames>(jsonStringHere);
JsonResultFileNames jsonResult=Newtonsoft.Json.JsonConvert.DeserializeObject(jsonstringher);
然后有一个c#对象表示json数据。同样,你也可以用它变得更加复杂,但是JSON.Net需要注意的重要一点是,它实际上是反序列化为c#表示的。例如,如果您想直接反序列化为字符串数组,那么json中应该只有一个字符串数组(没有对象/字段名等)

例如,在我工作的地方,我们有一个api,它返回这样的结果

{
    fileNames: JSON.stringify(arFileNames)
};
"{"filenames":["somefile","somefile2","somefile3"]}"
public class JsonResultFileNames 
{
    [Newtonsoft.Json.JsonProperty(PropertyName = "filenames")]
    public string[] FileNames { get; set; }        
}
{ 地位:{ 成功:正确; }, 客户数据{ id:{some guid}, 姓名:某客户姓名 } }

问题是,我的C#类需要由嵌套类组成,例如,我需要一个类来表示状态,一个类来表示customerdata。在这样做时,命名可能会变得奇怪,我最终得到了CustomerResponse、CustomerResponseStatus、CustomerResponseData,其中CustomerResponseStatus和CustomerResponseData在CustomerResponse中公开,我将json反序列化为CustomerResponse类型


如果您的json只是一个字符串数组,那么您应该能够对传递到JsonConvert.Deserialize的类型使用string[],这将不需要您创建响应类来保存数据。

诀窍是将my
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

什么是空白?filenames参数或控制器方法的代码?抱歉-控制器方法的代码为空。因此,如果文件名有值,则不执行?文件名已为列表类型,是该列表上listitem的类型。我认为FileObj只是一个JSON文件名字符串,没有属性或属性。要处理您的列表,只需操作文件名。对不起
filenames
也为空。好的,没问题,基本上您发布的值的模型&控制器期望的模型必须是一对一的。我之所以这么认为是因为您可以告诉我们文件名为null,控制器代码正在启动jquery。所以更改filesObj.push({'name':name})时会发生什么情况;到filesObj.push({name})?