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