我关于ajax的问题。 (asp.net mvc)尝试将数据从控制器传递到视图;但是有一个错误: “无法加载资源:服务器响应状态为500(内部服务器错误)”
保存到服务器没有问题。但是我无法在代码上达到“警报”状态。我的代码是;
CONTROLLER
[HttpPost]
public JsonResult Asker(Question q)
{
db.Users.FirstOrDefault(x => x.UserId == 1).Questions.Add(q);
db.SaveChanges();
return Json(q);
}
查看
<script>
$( function()
{
$("#ask-btn").click(function () {
var q = {};
q.Que = $("#ask-txt").val();
$.ajax({
type: "POST",
url: "/SomebodysPage/Asker",
data: '{q: ' + JSON.stringify(q) + '}',
contentType: "application/json; charset=utf-8",
success: function (response) {
alert("It's alright.");
},
});
});
})
</script>
我的问题类别:
public class Question
{
public int QuestionId { get; set; }
public string Que { get; set; }
[ForeignKey("User")]
public int UserId { get; set; }
public virtual User User { get; set; }
public virtual Answer Answer { get; set; }
}
答案 0 :(得分:1)
使用对象本身来保存数据并同时作为视图对象是一种不好的做法。 视图模型模式指示仅使用必需的属性作为实体对象来保存数据(在您的情况下为Question类),然后保存后, 仅将必要的数据映射到新的对象(例如QuestionModel),以将其显示给客户端。例如,如果客户仅需要请求的成功或失败 然后仅返回具有两个可能状态的一个属性的对象。 User和Answer类也可能在序列化时遇到问题。 您应该避免返回复杂的对象作为对客户端的响应。我怀疑“答案”用户有一些循环引用, 无法json序列化。我假设您正在使用Entity框架,请尝试 带有[NonSerialized]标签的快速解决方案。
public class Question
{
public int QuestionId {get; set; }
public string Que {get; set; }
[ForeignKey ("User")]
public int UserId {get; set; }
[NonSerialized]
public virtual User User {get; set; }
[NonSerialized]
public virtual Answer Answer {get; set; }
}
答案 1 :(得分:0)
我认为问题是您从ajax发送的数据。试试这个ajax电话
<script>
$( function()
{
$("#ask-btn").on('click', function () {
var dataToSend = $("#ask-txt").val();
$.ajax({
type: "POST",
url: "/SomebodysPage/Asker",
data: {question: JSON.stringify(dataToSend) },
contentType: "application/json;",
success: function (response) {
if(response) { alert("It's alright."); }
else { console.log(response); }
},
error: function(response) {
console.log(response);
}
});
});
})
</script>
此外,由于您要传递JSON字符串,因此控制器需要的是字符串,而不是Question
类型的对象。您应该像这样将字符串反序列化为Question
类型的对象:
[HttpPost]
public JsonResult Asker(string question)
{
Question q = new Question();
JavaScriptSerializer json_serializer = new JavaScriptSerializer();
try {
//try to convert string to an object of type Question
q = (Question)json_serializer.DeserializeObject(question);
}
catch(Exception e) {
return Json(q);
}
//Now we have an object of type Question from the json
db.Users.FirstOrDefault(x => x.UserId == 1).Questions.Add(q);
db.SaveChanges();
return Json(q);
}