我有一种情况,我使用Ajax.BeginForm()将一些数据(注释表单)发布到控制器方法。然后,此控制器方法使用实体框架将一些信息写入数据库(只要ModelState有效)。
作为我表单的一部分,我使用OnSucess重载,在表单发布后执行javascript函数。这个函数基本上调用另一个控制器方法(它返回一个局部视图 - 在这种情况下是注释列表)。
我的问题是,新添加的注释不包含在从控制器操作返回的视图中,尽管我知道它存在于数据库中。
这引出了两个可能的选择:
在2的情况下,我不知道实体框架曾经缓存数据,除非被明确告知这样做。所以我认为它是1。
在我的调查中,我修改了我的OnSucess方法和控制器操作。
我的表单定义如下:
@using (Ajax.BeginForm("CreateComment", "Home", new AjaxOptions { HttpMethod = "POST", OnSuccess = "something" })){
...
}
我的控制器操作定义为(为清晰起见,省略了详细信息):
public ActionResult CreateComment(CreateCommentViewModel comment)
{
if (ModelState.IsValid)
{
var context = new myDataContext();
var newComment = new BlogComment
{
BlogID = comment.BlogID,
CommentContent = comment.CommentContent,
CommentDateCreated = DateTime.Now,
CommentDeleted = false,
CommentLive = true,
CommenterEmail = comment.CommenterEmail,
CommenterName = comment.CommenterName
};
var errorList = new List<string>();
context.BlogComments.Add(newComment);
try
{
context.SaveChanges();
}
catch (DbEntityValidationException dbEx)
{
errorList.AddRange(from validationErrors in dbEx.EntityValidationErrors from validationError in validationErrors.ValidationErrors select string.Format("Property: {0} Error: {1}", validationError.PropertyName, validationError.ErrorMessage));
}
finally {
return Json(new { result = -2, message = "Error saving to database" }); // Not currently handled client side
}
return Json(new { result = 0, message = "Sucess" });
}else
{
var errorList = (from modelState in ViewData.ModelState.Values from error in modelState.Errors select error.ErrorMessage).ToList();
string message = errorList.Aggregate(string.Empty, (current, errorMessage) => current + (errorMessage + ","));
return Json(new { result = -1, message = message });
}
}
最后,客户端方法定义为:
function something(data) {
switch (data.result) {
case 0:
// Sucess
// Get the Alert
var message = "<strong>Thank You</strong> Your comment has been posted.";
var myAlert = jQuery("#donemessage");
myAlert.html(message);
reloadBlogComments();
break;
case -1:
var errorMessages = data.message.split(',');
var html = "<strong>The following errors were detected:</strong><br/>";
var length = errorMessages.length, element = null;
for (var i = 0; i < length; i++) {
element = errorMessages[i];
// Do something with element i.
html += element + "<br/>";
}
var myErrorAlert = jQuery("#failmessage");
myErrorAlert.html(html);
myErrorAlert.show(500).css("visibility", "visible");
break;
default:
alert(data.message);
break;
}
}
在返回值0时,调用函数reloadBlogComments()。
然而,上述修改证明我上面提到的第一个假设(1)实际上是错误的。在控制器返回值之前,无法执行成功函数。所以我完全不知道为什么新添加的评论不会与其他评论一起返回。
我的reloadBlogComments()函数定义如下:
function reloadBlogComments() {
jQuery.ajax({
// edit to add steve's suggestion.
//url: "/ControllerName/ActionName",
url: '@Url.Action("RenderBlogComments", "Home")',
data: { 'BlogID': '@Model.BlogID' },
success: function (newdata) {
jQuery("#upComments").empty().html(newdata);
},
statusCode: {
404: function (content) { alert('cannot find resource'); },
505: function (content) { alert('internal server error'); }
},
error: function (req, status, errorObj) {
// handle status === "timeout"
// handle other errors
}
});
var myAlert = jQuery("#donemessage");
var myErrorAlert = jQuery("#failmessage");
myErrorAlert.hide(500).css("visibility", "hidden");
myAlert.show(500).css("visibility", "visible");
// Clear the form
jQuery('#CommenterName').val('');
jQuery('#CommenterEmail').val('');
jQuery('#CommentContent').val('');
window.location.hash = '#comments';
}
即使使用setTimeout(function () { reloadBlogComments(); }, 3000);
延迟对reloadBlogComments()的调用,也无法实现一致的值。
我在哪里错了?
答案 0 :(得分:0)
好的,问题很简单:
$.ajax({
cache:false,
...
});