Ajax.Beginform并重新加载部分视图

时间:2012-11-25 20:55:23

标签: javascript jquery asp.net-mvc-3 ajax.beginform

我有一种情况,我使用Ajax.BeginForm()将一些数据(注释表单)发布到控制器方法。然后,此控制器方法使用实体框架将一些信息写入数据库(只要ModelState有效)。

作为我表单的一部分,我使用OnSucess重载,在表单发布后执行javascript函数。这个函数基本上调用另一个控制器方法(它返回一个局部视图 - 在这种情况下是注释列表)。

我的问题是,新添加的注释不包含在从控制器操作返回的视图中,尽管我知道它存在于数据库中。

这引出了两个可能的选择:

  1. 在控制器方法实际返回之前,正在执行htmlhelper形式的OnSucess()函数。
  2. 实体框架正在追逐数据。
  3. 在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()的调用,也无法实现一致的值。

    我在哪里错了?

1 个答案:

答案 0 :(得分:0)

好的,问题很简单:

$.ajax({
 cache:false,
 ...
});