【发布时间】:2016-04-07 17:46:24
【问题描述】:
我正在使用github/fetch polyfill 将一些数据发布回服务器。
fetch('./PerformSearch', {
method: 'POST',
header: {
'Accept' : 'application/json',
'Content-type' : 'application/json'
},
body: JSON.stringify({
terms: this.refs.termsFilter.getSelections(),
details: this.refs.detailsFilter.getSelections(),
dateRange: {
from: new Date(),
til: new Date()
}
})
})
但控制器不会像从表单变量中那样自动将请求的主体反序列化为参数中的数据对象。如果我使用 XmlHttpRequest 执行此操作,它可以工作..
var request = new XMLHttpRequest();
request.open("POST", url, true);
request.setRequestHeader("Content-type","application/json;charset=UTF-8")
...
request.send(JSON.stringify(data))
目前在控制器中接收请求的函数非常简单——它什么都不做,我只是想让它立即使用以下命令将 json 主体反序列化为数据对象:
public JsonResult PerformSearch(SearchModel.SearchSelections data)
{
//data has not been serialised
Stream req = Request.InputStream;
string body = new IO.StreamReader(req).ReadToEnd;
Console.WriteLine(body); // writes a json string
}
所以是的,我可以使用 json 库自己在函数内部反序列化,但我宁愿找到一种方法让控制器为我做这件事。
更新:
这是我要反序列化的 .net 对象:
class SearchModel
{
public class SearchSelections
{
public SearchTermList terms { get; set; }
public SearchDetailsList details { get; set; }
public DateRange dateRange { get; set; }
}
public class SearchTermList
{
public IEnumerable<string> exams { get; set; }
public IEnumerable<string> areas { get; set; }
public IEnumerable<string> classes { get; set; }
public IEnumerable<string> tokens { get; set; }
}
public class SearchDetailsList
{
public IEnumerable<string> studyTypes { get; set; }
public IEnumerable<string> species { get; set; }
public IEnumerable<string> strains { get; set; }
}
public class DateRange
{
public System.DateTime @from { get; set; }
public System.DateTime til { get; set; }
}
}
【问题讨论】:
-
您确定您的 SearchModel.SearchSelections 模型对应您传输到服务器的 JSON 模型吗?
-
是的,如果你愿意,我可以将它们都添加到问题中?
-
是的,请添加
-
好的,明天早上再发吧,我现在没有那台笔记本电脑。
-
检查浏览器的“网络”选项卡,看看 fetch() 和 XMLHTTPRequest 发送的请求有什么不同
标签: javascript c# json asp.net-mvc fetch-api