将JSON添加到Controller中的List

时间:2014-11-21 20:20:12

标签: c# asp.net-mvc json post

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

我有一个对象,我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)
{

}

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

2 个答案:

答案 0 :(得分:0)

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

{
    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中应该只有一个字符串数组(没有对象/字段名称等)。

E.g。在我工作的地方,我们有一个api,返回这样的结果,

{        状态: {            成功:真实;        },        customerdata {          id:{some-guid},          名称:一些客户名称        }    }

问题在于,我的C#类需要由嵌套类组成,例如:我需要一个表示状态的类和一个表示customerdata的类。在做到这一点时,事情可能会变得很奇怪,我最终得到的结果是CustomerResponse,CustomerResponseStatus,CustomerResponseData,CustomerResponseStatus和CustomerResponseData在CustomerRespnose中公开,我将json反序列化为CustomerResponse类型。

如果你的json只是一个字符串数组,你应该可以使用string []作为传递给JsonConvert.Deserialize的类型,这不需要你创建响应类来保存数据。

答案 1 :(得分:0)

诀窍是将我的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只是为了安全起见。