ajax总是进入代码的错误部分

时间:2013-02-19 00:44:56

标签: c# asp.net-mvc jquery

我对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调试器中响应变量的屏幕截图,其中一条评论让我发现。

Screenshot!

谢谢!

2 个答案:

答案 0 :(得分: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,从而产生类似于/Recipe/Rate?IDRecipe=123&Score=123的URL,由MVC解释用于查找在Rate方法调用中初始化的相应参数的代码。同样,Json(true)方法中的Json(false)Rate返回将转换为JSON编码的字符串,并作为响应正文返回。

答案 1 :(得分: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');
                    }
                });