Post Redirect Get PRG パターンを使用する必要があります。
Kazi Manzur Rashidによるこのブログ投稿の「データ変更に PRG パターンを使用する」セクションをお読みください。http://weblogs.asp.net/rashid/archive/2009/04/01/asp-net-mvc-best-practices-part-1.aspx
このアプローチは、リダイレクト間でデータTempData
を維持するために使用されます。ModelState
[HttpPost, ValidateAntiForgeryToken, ExportModelStateToTempData]
public ActionResult Create(FormCollection form)
{
Product p = new Product();
if (TryUpdateModel<IProductModel>(p))
{
productRepository.CreateProduct( p );
}
else
{
// add additional validation messages as needed
ModelState.AddModelError("_generic", "Error Msg");
}
return RedirectToAction("Index");
}
そして、これがあなたのIndex
アクションメソッドです。
[ImportModelStateFromTempData]
public ActionResult Index()
{
IList<Product> products = productRepository.GetAll();
return View("Index", products);
}
そして、これがあなたのIndex
見解です。
<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<IList<Product>>" %>
<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
Index
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
<h2>Products</h2>
<% foreach (var p in Model) { %>
<div><%= Html.Encode( p.ProductName ) %></div>
<% } %>
<%= Html.ValidationSummary("Please correct the errors", new { id = "valSumCreateForm" }) %>
<% using (Html.BeginForm("Create", "Product")) { %>
Product Name: <%= Html.TextBox("ProductName") %>
<%= Html.AntiForgeryToken() %>
<% ViewContext.FormContext.ValidationSummaryId = "valSumCreateForm"; %>
<% } %>
</asp:Content>
ImportModelStateFromTempData
およびExportModelStateToTempData
属性は、リダイレクト間でモデルの状態エラーを転送するのに役立ちます。これ
<% ViewContext.FormContext.ValidationSummaryId = "valSumCreateForm"; %>
MVC フォームを対応する検証の概要に関連付けます。
ここでも、これに関する別の回答を確認できます。
ASP.NET MVC2 での SelectList バインディングを使用した ViewModel
ご不明な点がございましたら、お知らせください。
・添