0

親アクション内に子アクションを埋め込み、子アクションからフォームが送信されたときにページ全体を適切にレンダリングする方法を学んでいます。

ParentAction.cshtml --------------------------------------

@model Web1.Models.ParentActionModel
@{ViewBag.Title = "ParentAction";}
<h2>Parent Action</h2>
@Html.ValidationSummary(true, "Please correct parent errors and try again.")
@using (Html.BeginForm()) {
  //parent forminput  stuff
  <input type="submit" value="Parent Button" />
}
@Html.Action("ChildAction","Home") <!-- ChildAction is included here -->

ChildAction.cshtml(parent.cshtmlに含まれています)------------

@model Web1.Models.ChildActionModel
@{ViewBag.Title = "ChildAction";}
<h2>Child Action</h2>    
@Html.ValidationSummary(true, "Please correct child errors and try again.")
@using (Html.BeginForm("ChildAction", "Home")) {
    //child form input stuff
    <input type="submit" value="Child Button" />
}

HomeController.cs -----------------------

public ActionResult ParentAction() {
    return View();
}
[HttpPost]
public ActionResult ParentAction(ParentActionModel pmodel) {
    //do model update stuff
    return View(pmodel);
}
[ChildActionOnly]
public ActionResult ChildAction() {
    return PartialView();
}
[HttpPost]
public ActionResult ChildAction(ChildActionModel cmodel) {
    //do model update stuff
    return PartialView(cmodel); // <---This is wrong, What's the correct way to do it?
}

ここで、[子ボタン]をクリックすると、子アクション(durrr!)のビューのみが表示されますが、完全なページの親+子ビューを生成するように修正するにはどうすればよいですか?それは十分に簡単な論理のように思えますが、私は何時間もそれに固執しています。

4

1 に答える 1

2

したがって、HttpPost Detailsメソッドの[ChildActionOnly]を削除した場合、[送信]をクリックすると、Details.cshtmlのpartialViewのみが返され、Master.cshtmlは返されません。これも、必要なものではありません。

これは、この場合、PartialViewを返すのではなく、完全なビューを返す必要があるためです。

[HttpPost]
public virtual ActionResult Details(DetailsModel model) 
{
    if (!ModelState.IsValid)
    {
        return View(model);
    }

    return RedirectToAction("Success");
}

Detailsまた、無限ループを回避するために、条件付きでのみアクションをレンダリングする必要がある場合もあります。

@if (!IsPost)
{
    @Html.Action("Details", "Home")
}

明らかに、このPOSTアクションを呼び出したときに元のコンテキストを保持したい場合は、AJAXを使用してから、このPOSTアクションをAJAXで呼び出し、DOMの対応する部分のみを置き換える必要があります。

于 2012-06-22T09:52:32.300 に答える