我有一个名为sendData
的Javascript函数。
var sendData = function (data) {
alert("The following data are sending to the server");
var dataToSend = JSON.stringify(data);
alert(dataToSend);
$.ajax({
type: "POST",
url: "Submit",
dataType: "json",
data: dataToSend,
contentType: "application/json; charset=utf-8",
success: function (response, textStatus, jqXHR) {
alert("success");
},
error: function (jqXHR, textStatus, errorThrown) {
alert("fail");
}
});
};
通过使用这个js函数,我可以看到dataToSend
[{"Seminar_Code":"CMP04","Speaker":"1","Tag":"1","DateAndTime":""}, {"Seminar_Code":"CMP04","Speaker":"2","Tag":"2","DateAndTime":""},{"Seminar_Code":"CMP04","Speaker":"3","Tag":"3","DateAndTime":""}]
然后我使用http://jsonlint.com/检查了它。这是有效的。
然后我在Controller Layer使用下面的代码。
[AcceptVerbs(HttpVerbs.Post)]
//[JsonFilter(Parameter = "seminar_detail", JsonDataType = typeof(Seminar_Detail))]
public ActionResult Submit(JsonResult Jresult)
{
//var ttt = JsonConvert.DeserializeObject(Request["jsonString"], typeof(List<Seminar_Detail>));
//var result = (new JsonSerializer()).Deserialize<List<Seminar_Detail>>(seminar_detail);
//var result = JsonConvert.DeserializeObject<List<Seminar_Detail>>(seminar_detail.ToString());
var result = JsonConvert.DeserializeObject<List<Seminar_Detail>>(Jresult.ToString());
return View();
}
然后,我收到了这个错误。
JsonReaderException was unhandled by user code
Unexpected character encountered while parsing value: S. Line 0, position 0.
使用Immediate window from vs 2010 IDE --- > Jresult.Data
,我得到null。
立即窗口的结果
Jresult.ToString()
"System.Web.Mvc.JsonResult"
Jresult.Data.ToString()
'Jresult.Data' is null
Jresult.Data
null
我正在使用Newtonsoft.Json and Asp.net MVC 4
。
请让我知道如何解决此错误。
答案 0 :(得分:3)
创建视图模型:
public class Seminar
{
public string Seminar_Code { get; set; }
public string Speaker { get; set; }
public string Tag { get; set; }
public string DateAndTime { get; set; }
}
然后让您的控制器操作将此视图模型的列表作为参数:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Submit(IEnumerable<Seminar> seminars)
{
... don't need to use any JSON serializers here.
return View();
}
这将在ASP.NET MVC 3中起作用。
如果您使用的是旧版本,则可以按following blog post中的说明创建自定义JsonValueProviderFactory
,并且仍然可以将模型保留在您的操作中。
但是在任何情况下都不要在控制器中放置序列化基础设施代码。控制器不负责序列化/反序列化对象。
答案 1 :(得分:0)
使控制器参数类型为string,然后使用Newtonsoft.Json对其进行反序列化。
JSONResult属于ActionResult类型,不应用作操作参数。
你也是第一次尝试让Model Binder为你反序列化它,比如
在你的ajax调用试试,
data: { 'result': dataToSend }
和你的控制器一样
public ActionResult Submit(IEnumerable<Seminar_Detail> result)
{
....