1

我对 ajax 不是很好,但要使用我的一个 jquery 插件,我必须在 ajax 中做一些调用。问题是它总是在函数的错误处理中,我不知道为什么。由于我使用的是 Visual Web Developper Express,因此 JavaScript 调试不起作用。

这是jquery函数:

$('.auto-submit-star').rating({
            callback: function (value, link) {
                $.ajax({
                    type: "POST",
                    url: "/Recipe/Rate",
                    data: $("#rate").serialize(),
                    dataType: "text/plain",
                    success: function (response) {
                        if (response != 'false') {
                            alert('Your vote has been saved');
                        } else {
                            alert('You already voted for this recipe!');
                        }
                    },
                    error: function (response) {
                        alert('There is an error');
                    }
                });
            }
        });

然后,它进入控制器。我已经调试了这部分并且它可以工作,它将好的值保存在数据库中,然后根据用户是否已经投票返回“false”或“”。

这是代码:

[HttpPost]
        [Authorize]
        public ActionResult Rate(FormCollection form)
        {
            var rate = Convert.ToInt32(form["Score"]);
            var id = Convert.ToInt32(form["IDRecipe"]);

            //On valide si l'utilisateur a déja voté
            Guid userGuid = (Guid)Membership.GetUser().ProviderUserKey;
            var existingVote = db.StarRatings.Where(a => a.IDRecipe == id).Where(b => b.IDUser == userGuid).FirstOrDefault();

            if (existingVote != null)
                return Content("false");

            StarRating rating = new StarRating();
            rating.IDRecipe = id;
            rating.IDUser = (Guid)Membership.GetUser().ProviderUserKey;
            rating.Score = rate;

            var recipe = db.Recipes.Where(a => a.IDRecipe == id).First();
            recipe.StarRatings.Add(rating);
            db.SaveChanges();

            return Content("");
        }

任何人都可以告诉我为什么我总是收到“有错误”的消息,而它从来没有进入 ajax 调用的“成功”部分?我需要在控制器中返回一些特殊的东西吗?

编辑

这是 Internet Explorer 调试器中响应变量的屏幕截图,其中一条评论让我发现。

截屏!

谢谢!

4

2 回答 2

2

我建议进行以下更改:

[HttpPost]
[Authorize]
public JsonResult Rate(int Score, int IDRecipe)
{
    //On valide si l'utilisateur a déja voté
    Guid userGuid = (Guid)Membership.GetUser().ProviderUserKey;
    var existingVote = db.StarRatings.Where(a => a.IDRecipe == IDRecipe).Where(b => b.IDUser == userGuid).FirstOrDefault();

    if (existingVote != null)
        return Json(false);

    StarRating rating = new StarRating();
    rating.IDRecipe = IDRecipe;
    rating.IDUser = (Guid)Membership.GetUser().ProviderUserKey;
    rating.Score = Score;

    var recipe = db.Recipes.Where(a => a.IDRecipe == IDRecipe).First();
    recipe.StarRatings.Add(Score);
    db.SaveChanges();

    return Json(true);
}

你的 JavaScript 调用:

$('.auto-submit-star').rating({
    callback: function (value, link) {
        $.ajax({
            type: "POST",
            url: "/Recipe/Rate",
            data: { IDRecipe: GetRecipeID(), Score: GetScore() },
            cache: false,
            success: function (response) {
                alert(response);
            },
            error: function (xhr, error) {
                alert(error);
            }
        });
    }
});

data传递给调用的对象值$.ajax将作为一组查询参数附加到 URL,从而产生一个类似于该 URL 的 URL /Recipe/Rate?IDRecipe=123&Score=123,MVC 代码会解释该 URL 以找到适当的参数以在对该Rate方法的调用中进行初始化。同样,方法中的Json(true)andJson(false)返回Rate将被转换为 JSON 编码的字符串并作为响应的主体返回。

于 2013-02-19T02:09:48.553 回答
1

我能够重现此问题并通过使用text而不是text/plain. 我对原因的理解是浏览器首先将响应解释为 HTML 并因此引发错误。我可以在控制台中运行代码并在遇到我的控制器返回的文本“Blah”并显示“意外的令牌 B”时看到解析错误。

除了对 Firefox 中问题的引用之外,我找不到任何可靠的文档,但我使用的是 Chrome 并且遇到了同样的问题。解决方法是使用xhr.overrideMimeType("text/plain; charset=x-user-defined");此处提到的http://api.jquery.com/jQuery.ajax/如果您的浏览器仍然不喜欢文本,您可能需要这样做。

                $.ajax({
                    type: "POST",
                    url: "/Recipe/Rate",
                    data: $("#rate").serialize(),
                    dataType: "text",
                    success: function (response) {
                        if (response != 'false') {
                            alert('Your vote has been saved');
                        } else {
                            alert('You already voted for this recipe!');
                        }
                    },
                    error: function (response) {
                        alert('There is an error');
                    }
                });
于 2013-02-19T02:21:52.533 回答