【问题标题】:unable to update partial view using jquery ajax in mvc 4无法在 mvc 4 中使用 jquery ajax 更新部分视图
【发布时间】:2014-02-22 20:08:04
【问题描述】:

我正在尝试更新部分视图,但无法更新。我正在分享我到目前为止所做的代码。

行动:

public ActionResult AddReview([Bind(Include = "ReviewId,ProductId,ReviewerName,ReviewText,Rating,Time,Summary")]
            Review review, int? id)
        {



            var reviewsList = new List<Review>();
            reviewsList.Add(review);

            if (ModelState.IsValid)
            {
                review.Time = DateTime.Now;
                review.ProductId = id.Value;
                db.Reviews.Add(review);
                db.SaveChanges();
                if (Request.IsAjaxRequest())
                {
                    // return HttpNotFound();

                    return PartialView("_Reviews", reviewsList);
                }
            }



            return HttpNotFound();
        }

这个 JQuery 代码:

   $(function () {
    var ajaxFormSubmit = function () {
        var $form = $(this);
        var options = {
            url: $form.attr("action"),
            type: $form.attr("method"),
            data: $form.serialize()
        };

        $.ajax(options).done(function (data) {
            var $target = $($form.attr("data-consumer-target"));
            var $newHtml = $(data);
         //   $target.replaceWith($newHtml);
            $target.append($newHtml);
            $newHtml.effect("highlight");
            success: alert('Thanks for your review');
            $("#ajax-contact-form").find('input, textarea').val("");


        });

        return false;
    };

    $("form[data-consumer-ajax='true'").submit(ajaxFormSubmit);
});

这是部分视图_Reviews:

@model IEnumerable<ConsumerSimpleNew.Models.Entities.Review>

<div id="reviews">
    @foreach (var item in Model)
    {
        <h5>
            <span class="color"> @Html.DisplayFor(modelitem => item.ReviewerName)</span> - @item.Time.ToString("MMM dd-yyyy")
        </h5>

        <h6>Summary - @Html.DisplayFor(modelitem => item.Summary)</h6>
        <h6>Rating: @Html.DisplayFor(modelitem => item.Rating)</h6>
        <div class="std">@Html.DisplayFor(modelitem => item.ReviewText)</div>
        <hr />
    }
</div>

这是详细视图:

 @Html.Partial("_Reviews", Model.Reviews)


                            <div class="form-add">
                                <h2>Write Your Own Review</h2>

                                <form method="post" action="@Url.Action("Details")"
                                      data-consumer-ajax="true" data-consumer-target="#reviews">


                                    @Html.AntiForgeryToken()
                                    @Html.ValidationSummary(true)

                                    <fieldset>
                                        <h4>You're reviewing: <span class="color">@Model.Product.Name</span></h4>

                                        <span id="input-message-box"></span>

                                        <input type="hidden" name="validate_rating"
                                               class="validate-rating" value=""><ul class="form-list">
                                            <li>
                                                <label for="nickname_field" class="required"><em>*</em>Name</label>
                                                <div class="input-box">
                                                    @Html.TextBoxFor(modelitem => Model.Review.ReviewerName, new
                                                {
                                                    @class = "input-text required-entry",
                                                    placeholder = "Write your name"
                                                })
                                                    @Html.ValidationMessageFor(model => model.Review.ReviewerName)

                                                </div>
                                            </li>
                                            <li>
                                                <label for="summary_field" class="required"><em>*</em>Summary of Your Review</label>
                                                <div class="input-box">
                                                    @Html.TextBoxFor(modelitem => Model.Review.Summary, new
                                                {
                                                    @class = "input-text required-entry",
                                                    placeholder = "Write Summary"
                                                })
                                                    @Html.ValidationMessageFor(model => model.Review.Summary)


                                                </div>
                                            </li>

                                            <li>
                                                <label for="summary_field" class="required"><em>*</em>Rating (out of 10)</label>
                                                <div class="input-box">
                                                    @Html.TextBoxFor(modelitem => Model.Review.Rating, new
                                                {
                                                    @class = "input-text required-entry",
                                                    placeholder = "Give Some Rating"
                                                })
                                                    @Html.ValidationMessageFor(model => model.Review.Rating)


                                                </div>
                                            </li>
                                            <li>
                                                <label for="review_field" class="required"><em>*</em>Review</label>
                                                <div class="input-box">
                                                    @Html.TextAreaFor(modelitem => Model.Review.ReviewText, new
                                                {
                                                    cols = "15",
                                                    rows = "13",
                                                    @class = "required-entry",
                                                    placeholder = "Write your review..."
                                                })
                                                    @Html.ValidationMessageFor(model => model.Review.ReviewText)


                                                </div>
                                            </li>
                                        </ul>
                                    </fieldset>
                                    <div class="buttons-set">
                                        <input type="submit" title="Submit Review" class="button pull-right" value="Submit Review" />
                                    </div>
                                </form>

我已经使用并搜索了很多可能的解决方案,但我无法为这件事找到最好的解决方案。请帮我解决这个问题,我在哪里犯了错误。

【问题讨论】:

    标签: jquery ajax asp.net-mvc asp.net-mvc-4


    【解决方案1】:

    我以前从未见过这样构建的 ajax。尝试将您的 ajax 调用更改为此

    $('.btnSubmit').on('click', function(){
        $.ajax({
            url: '@Url.Action("Action", "Controller")',
            type: 'post',
            cache: false,
            async: true,
            data: { id: "frmUser" },
            success: function(result){
                $('.divPartial').html(result);
            } 
        });
    });
    

    这会将返回的部分视图放入具有类 divPartial 的 div 中

    【讨论】:

    • 您的代码不起作用,实际上我想更新局部视图,其他一切正常,但在表单发布后,局部视图在提交时未更新,但对控制器的调用已成功完成
    • 这将更新局部视图。这将在单击具有类 btnSubmit 的按钮时触发。有什么不好的地方?
    • @Matt 那行不通。请在stackoverflow.com/questions/23033242/… 中查看我的问题
    【解决方案2】:

    看起来您正在将“评论”传递给您的局部视图,但您的局部视图正在等待

    IEnumerable<ConsumerSimpleNew.Models.Entities.Review> 
    

    在你的 jquery 调用中添加一个 error: 部分,看看它是否被命中?

    if (ModelState.IsValid)
            {
                review.Time = DateTime.Now;
                review.ProductId = id.Value;
                db.Reviews.Add(review);
                db.SaveChanges();
            }
            if (Request.IsAjaxRequest())
            {
               // return HttpNotFound();
            var reviewsList = new List<Review>();
            reviewsList.Add(review);
    
                return PartialView("_Reviews", reviewsList);
            }
    

    【讨论】:

    • 我已尝试更改“评论”但得到模型项目错误,部分视图未更新但其余工作正常,
    • 我已经更新了我的答案,尝试将 reviewList 传递到 PartialView 中
    • 谢谢,它工作得很好,但是现在当我提交表单时,它只显示新评论,而不是以前评论的列表,并且提交后它没有清空页面的文本字段。
    • 您有几个选择:1) 为 SingleReview 创建一个新的部分视图,并将其附加到您的评论中,即 $target.replaceWith($newHtml) 更改为 $target.append($newHtml);或 2) 在控制器中再次获取所有评论并再次传递所有评论。关于清空文本字段,您可以在 javascript 中手动执行此操作。
    • 我和你写的一样,但现在如果列表中至少有一条评论,它就可以工作,否则我必须刷新页面才能看到更改。如果至少有一个现有的评论,它就可以正常工作。为什么会这样?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多