我一直在尝试很多可能的解决方案而且没有一个工作,我有这样的东西,但我不知道json结构是否正确,或者我不是正确地将它发送到服务器端,我我想知道问题的根源在哪里。 这是错误:没有为'System.String []'类型定义无参数构造函数。
客户端
function upload() {
var title = [];
var files = $('#myfile').prop("files");
var names = $.map(files, function (val) { return val.name; });
for (var i = 0; i < names.length; ++i) {
var item = { 'titulo' : names[i] };
title.push(item);
}
var myJSON = JSON.stringify({ titulos: title });
console.log(myJSON);
$.ajax({
async: true,
contentType: 'application/json; charset=utf-8',
dataType: 'json',
type: "POST",
data: myJSON,
url: "../handlers/saveUpload.ashx",
success: function (msg) {
$("#title").val("Sucesso");
$("#msg").val("Upload efectuado com sucesso.");
$("#alerta").show();
$("#gif").hide();
}
});
}
服务器端
try
{
date = DateTime.Now.ToShortDateString();
sessao = int.Parse(context.Session["userid"].ToString());
context.Response.ContentType = "application/json";
var data = context.Request;
var sr = new StreamReader(data.InputStream);
var stream = sr.ReadToEnd();
var javaScriptSerializer = new JavaScriptSerializer();
var arrayOfStrings = javaScriptSerializer.Deserialize<string[]>(stream);
foreach (var item in arrayOfStrings)
{
context.Response.Write(item.ToString());
}
}
catch (Exception msg) { context.Response.Write(msg.Message); }
答案 0 :(得分:1)
string[]
不是该操作的有效泛型类型; string
没有无参数构造函数,因此当序列化程序尝试new
一个时,它就会失败。此外,你已经有一个来自sr.ReadToEnd()
的字符串,所以你没有真正反序列化,更像是你要求它为你解析和分割字符串,这是不可能的。
JavaScriptSerializer
是非常无情的,说实话,在尝试反序列化这样的数组时,我总是把头发弄掉...你最好在服务器端定义一个DTO类来处理映射:
[Serializable]
public class Titles
{
public List<Title> TheTitles { get; set; }
}
[Serializable]
public class Title
{
public string title { get; set; }
}
所以现在你的处理程序看起来像这样:
public void ProcessRequest(HttpContext context)
{
try
{
context.Response.ContentType = "application/json";
var data = context.Request;
var sr = new StreamReader(data.InputStream);
var stream = sr.ReadToEnd();
var javaScriptSerializer = new JavaScriptSerializer();
var PostedData = javaScriptSerializer.Deserialize<Titles>(stream);
foreach (var item in PostedData.TheTitles )
{
//this will write SteveJohnAndrew as expected in the response
//(check the console!)
context.Response.Write(item.title);
}
}
catch (Exception msg) { context.Response.Write(msg.Message); }
}
你的AJAX是这样的:
function upload()
{
//example data
var Titles = [
{'title':'Steve'}, {'title':'John'}, {'title':'Andrew'}
];
var myJSON = JSON.stringify({ TheTitles: Titles });
console.log(myJSON);
$.ajax({
async: true,
contentType: 'application/json; charset=utf-8',
dataType: 'json',
type: "POST",
data: myJSON,
url: "jsonhandler.ashx",
success: function (msg) {
console.log(msg);
}
});
}
请注意DTO类的定义如何匹配完全 JSON对象属性的定义,如果没有,则反序列化将不起作用。
希望有所帮助。