【问题标题】:can't pass data from controller to view on ajax无法从控制器传递数据以在 ajax 上查看
【发布时间】:2019-07-10 11:49:23
【问题描述】:

关于 ajax 的问题。 (asp.net mvc) 尝试将数据从控制器传递到视图;但有一个错误: "加载资源失败:服务器响应状态为 500 (Internal Server Error)"

保存到服务器没有问题。但我无法在我的代码上达到“警报”。我的代码是;

控制器

[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; }

}

【问题讨论】:

  • 您的 Question 类是什么样的?它有一个名为 Que 的属性吗?
  • 是的。我已经添加了我的 Quesiton 类。

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


【解决方案1】:

使用对象本身来保存数据并同时用作视图对象是一种不好的做法。 视图模型模式规定仅使用需要的属性作为实体对象来保存数据,在您的情况下为 Question 类,并在保存后, 仅将必要的数据映射到像 QuestionModel 这样的新对象,以便将其显示给客户端。例如如果客户端只需要请求的成功或失败 然后返回只有一个属性和两种可能状态的对象。 User 和 Answer 类也可能难以序列化。 您应该避免返回复杂对象作为对客户端的响应。我怀疑 User, Answer 有一些循环引用, 不能被 json 序列化。我假设您正在使用实体框架,请尝试 带有 [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; }

}

【讨论】:

    【解决方案2】:

    我认为问题在于您从 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);
        }
    

    【讨论】:

    • 谢谢,我已应用此更改,但问题未解决。
    • SQL Server 保存数据。但是我的屏幕上没有警报;这个错误:“内部服务器 500”。我无法使用从 Json (q) 返回的数据
    • 浏览器控制台打印了什么?为此,我在 javascript 中添加了 console.log 语句。希望这可以提供有关错误的更多详细信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-20
    • 2015-12-27
    • 2021-04-19
    • 2021-04-09
    • 2012-12-22
    • 2017-03-15
    相关资源
    最近更新 更多