同じページに2つのフォームがあります。1つは、このPodFormと呼ばれる子アクションを介してレンダリングされる部分ビューのフォームです。2番目は、現在のアクションによってレンダリングされます。
したがって、私のコードは次のようになります(名前などは無視してください。これはサンプルコードです)。
Form.cshtml
@model MyProject.Models.FormInputModel
@using(Html.BeginForm("Form","Main",FormMethod.Post))
{
@Html.TextBoxFor(x=>x.AField)
@* Some other fields *@
<input type="submit"/>
}
<div class="sidebar">
@Html.Action("PodForm","Pod")
</div>
PodForm.cshtml
@model MyProject.Models.PodFormInputModel
@using(Html.BeginForm("PodForm","Pod",FormMethod.Post))
{
@Html.TextBoxFor(x=>x.Name)
@* Some other fields *@
<input type="submit"/>
}
メインフォームで[送信]をクリックすると、PodFormアクションメソッドがトリガーされます。どうしたの?
編集-コメントで要求されたように:
生成されたマークアップは次のようになります。
<form action="/Main/Form" encoding="multipart/form-data" method="POST"> <input type="text" name="AField" /> <input type="submit" /> </form> <div class="sidebar"> <form action="/Pod/PodForm" method="POST"> <input type="text" name="Name" /> <input type="submit" /> </form> </div>
コントローラのアクション
「MainController」(実際の名前ではありません)には、「Form」と呼ばれるアクションがあります
public MainController : Controller { public ActionResult Form() { return View(); } [HttpPost] public ActionResult Form() { if(ModelState.IsValid) { //Save } return View(); } }
「PodController」(実際の名前ではありません)には、「PodForm」と呼ばれるアクションがあります。HttpPostがビューを返さない理由は、子アクションからそれを行うと、部分的なビューだけが返されるためです。私が望むものではありません。
public PodController : Controller { public ActionResult PodForm() { return View(); } [HttpPost] public ActionResult PodForm(PodFormInputModel model) { if(ModelState.IsValid) { //Save the thing return RedirectToAction(Request.HttpReferrer.ToString()).AndFlash("Saved"); } return RedirectToAction(Request.HttpReferrer.ToString()).AndFlash("Not saved"); } }
更新:最初のアクションメソッドが呼び出されることがわかりましたが、View()を返すため、ビューエンジンは送信ロジックをトリガーするGetとしてではなくPostとしてPodFormアクションメソッドを呼び出しています。変。