繁体   English   中英

从Html.renderAction子级重定向父页面,而无需使用Ajax,Java,Jquery等

[英]Redirecting parent page from Html.renderAction child without using Ajax, Java, Jquery or such

我有一个问题,我在Html.RenderAction中有一个表单,提交表单后,我必须重新加载父表单,但是我不断收到“子行为无法执行重定向动作”。 因此,如果没有Ajax等如何解决呢?

在我的父母中,我有:

  @{ 
            var UserReviewExist = Model.Reviews.FirstOrDefault(x => x.AspNetUser.UserName == Name.AspNetUser.UserName);

        }

        @{if (UserReviewExist == null)
            {

                Html.RenderAction("ReviewCreate", "Reviews", new { BookID = Model.Id });
            }
        }

我的RenderAction视图包含以下内容:

    @model Trigger_Happy_Bunnies.Models.Review
@{
    Layout = null;
}
@{
    if (true)
    {
        Trigger_Happy_Bunnies.Models.Review newReview = new Trigger_Happy_Bunnies.Models.Review();
        <div style="border:1px black">
            @using (Html.BeginForm())
            {
                @Html.AntiForgeryToken()

                <div class="form-horizontal">
                    @Html.ValidationSummary(true, "", new { @class = "text-danger" })

并以

                                <div class="form-group">
                                <div class="col-md-offset-2 col-md-10">

                                    <input type="submit" value="Create" class="btn btn-default" />
                                </div>
                            </div>
                        </div>
                    }
                </div>
            }
        }
@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
}

最后,我在控制器中有这个:

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult ReviewCreate([Bind(Include = "Id,BookId,UserId,Text,Title,Rating,IsActive,IsReported,ReportedBy,ReportReason,ModifiedDate,ModifiedBy,CreatedDate")] Review review)
    {
        if (ModelState.IsValid)
        {
            db.Reviews.Add(review);
            db.SaveChanges();
            return View("~/Views/Reviews/ReviewCreate.cshtml");
        }

        ViewBag.UserId = new SelectList(db.AspNetUsers, "Id", "Email", review.UserId);
        ViewBag.BookId = new SelectList(db.Books, "Id", "UserId", review.BookId);
        return PartialView();
    }

那么提交表单时如何更新父视图?

我不确定您的问题在这里。 子动作只是将其响应转储到视图中。 因此,归根结底,无论您使用子操作,部分操作还是仅在视图中放入代码,您都只有一个包含表单的HTML文档。

调用不带参数的Html.BeginForm基本上表明它应该使用当前动作,但是即使在子动作的上下文中,它仍将是呈现的主要动作。 因此,您的表单将发布到该主要操作, 而不是您的子操作。

那是应该的 您无法发布到子操作中,因为这在网页上下文中是没有意义的。 从技术上讲,你可以 ,只要它没有被标记为[ChildActionOnly]但整个页面会切换到该所返回的响应,SANS布局的局部视图。 如果您只想替换通过子操作渲染的区域,则必须提交一个AJAX请求,该请求返回部分响应,并用该请求手动替换DOM中的相应节点。

换句话说,这就是子动作无法重定向的原因。 这不是一个真正的行动,也没有被路由到。 直到响应准备阶段才渲染它,到那时,响应中已经有数据,从而防止了任何更改,例如重定向。 如果您需要在表单发布后进行重定向,则应已将其放置在适当的位置,只需确保您的主要操作具有处理发布的版本,然后从那里进行重定向。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM