私のアプリケーションはCRUD契約が必要で、各契約に文書を添付することができます。 MVC5 - Html.Actionを含むビューの転記
- 1契約のプロパティを更新する(Edit.cshtml): だから、私の編集/更新]ページでは、私は三つの形式を持っています は
(表示するために必要はありません)契約からドキュメントを削除するには、それは次のようになります。
Edit.cshtml
@model ContractViewModel
@Html.Action("AddDocument", "Contracts", new { id = Model.IdContract })
@Html.Action("RemoveDocument", "Contracts", new { id = Model.IdContract })
@using (Html.BeginForm("Edit", "Contracts", FormMethod.Post, new { @class = "form-horizontal", enctype = "multipart/form-data" }))
{
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)
@Html.HiddenFor(model => model.IdContract)
<div class="form-group">
@Html.LabelFor(model => model.ContractNumber, htmlAttributes: new { @class = "control-label col-md-4" })
<div class="col-md-8">
@Html.EditorFor(model => model.ContractNumber, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.ContractNumber)
</div>
</div> [...]
<input type="submit" value="Update"/>
}
AddDocument.cshtml
@model DocumentViewModel
@using (Html.BeginForm("AddDocument","Contracts", FormMethod.Post, new { @class = "form-horizontal", enctype="multipart/form-data" }))
{
@Html.AntiForgeryToken()
@Html.HiddenFor(model => model.IdContract)
<div class="form-group">
@Html.LabelFor(model => model.DocHttp, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.TextBoxFor(x => x.DocHttp, htmlAttributes: new { @class = "form-control", data_style = "btn-primary", type = "file", multiple = "multiple" })
@Html.ValidationMessageFor(model => model.DocHttp)
</div>
</div>
<input type="submit" value="Add"/>
}
ContractController.csまず
public ActionResult Edit(int? id)
{
if (id == null)
{
throw new HttpException(400, "Bad request");
}
Contract contract = business.Get<Contract>(x => x.IdContract == id);
ContractViewModel vm = new ContractViewModel(contract);
if (contract == null)
{
throw new HttpException(404, "Not found");
}
return View(vm);
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit(ContractViewModel vm)
{
Contract contract = business.Get<Contract>(x => x.IdContract == id);
if (ModelState.IsValid)
{
[...]
}
return View(vm);
}
public ActionResult AddDocument(int id)
{
DocumentViewModel vm = new DocumentViewModel();
vm.IdContract = id;
return PartialView(vm);
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult AddDocument(DocumentViewModel vm)
{
Contract contract = business.Get<Contract>(x => x.IdContract == vm.IdContract);
if (ModelState.IsValid)
{
[...]
}
return RedirectToAction("Edit", "Contracts", new { id = vm.IdContract });
//return View(vm);
}
私が編集フォームを送信するとき、問題は、[HttpPost]編集方法は当然、と呼ばれているが、 [HttpPost] AddDocumentも参照してください。 Html.RenderPartialの代わりにHtml.Actionが使用されているのでしょうか?
私が正しいとすれば、Html.RenderPartialがパラメータを渡している間に、部分ビューを生成する前に処理を行う必要があるときに、Html.Actionが呼び出されます。
なぜ[HttpPost] AddDocumentメソッドが呼び出されますか?誰がそれを呼びましたか?
第2に、問題を回避するには、Viewメソッドを呼び出す代わりに[編集]ページにリダイレクトする必要があります。しかし、私は入力されたデータを失っています。この問題をどうやって管理できますか?
ありがとうございました。
感謝を読むが、あなたの答えは私を助けていない可能性があります。私は3つのHttpPostメソッドが(Edit、AddDocument、RemoveDocument)と呼ばれる理由を知りたかったのですが、Editメソッドだけを呼び出すはずでした。 – madhatterx
新しく作成したプロジェクトで問題を再現できませんでした。たぶん一部のカウリーブレースが外れていますか? – Kharlos