无法从控制器传递数据以在ajax上查看

时间:2019-02-16 15:13:53

标签: jquery asp.net ajax model-view-controller

我关于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; }

}

2 个答案:

答案 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);
    }