我看过很多帖子似乎在某种程度上解决了我的情况,但他们都让我有些困惑。
我有一个对象,我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)
{
}
我知道我的控制器方法的代码是空白的,但我不知道下一步该做什么。任何帮助将非常感激。谢谢!
答案 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转换为JsonResultFileNamesJsonResultFileNames 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
只是为了安全起见。