2

MVC の学習を始めたばかりで、その仕組みを理解しようとしています。

すべての編集、挿入、およびリスト操作のためにユーザーを別のビューに送りたくありません。

私のサンプル アプリケーションでは、View にアイテムのリストが含まれており、リストの下に (新しいアイテムを挿入するための) アクション "{Controller}/Create" を含むフォームがありますが、Create View はありません。

ユーザーが新しいアイテムを挿入すると、httpverb post で Create アクションにポストされ、アイテムが作成され、RedirectToAction メソッドで List アクションに戻ります。

ただし、このスタイルでは、Create アクションと List アクションの間でデータを渡すことができないため、ユーザーにメッセージ (エラー、情報など) を表示することはできません。どうやってやるの?

4

3 に答える 3

4

Post Redirect Get PRG パターンを使用する必要があります。

Kazi Manzur Ra​​shidによるこのブログ投稿の「データ変更に 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>
  1. ImportModelStateFromTempData およびExportModelStateToTempData 属性は、リダイレクト間でモデルの状態エラーを転送するのに役立ちます。これ
  2. <% ViewContext.FormContext.ValidationSummaryId = "valSumCreateForm"; %>MVC フォームを対応する検証の概要に関連付けます。



ここでも、これに関する別の回答を確認できます。 ASP.NET MVC2 での SelectList バインディングを使用した ViewModel


ご不明な点がございましたら、お知らせください。
・添

于 2010-06-23T15:49:03.923 に答える
0

ほとんどの MVC フレームワークには、この目的のためだけに、次のリクエストまで少量のデータを一時的に保存する機能があります。ASP.NET MVC では TempData と呼ばれ、Rails では :flash などと呼ばれます。

于 2010-06-23T15:31:50.530 に答える
0

この記事では、 TempDataの使用方法について説明します。

Web プログラミングで対処しなければならない厄介なことの 1 つは、フォームのエラーです。具体的には、エラー メッセージを表示したいが、以前に入力したデータを保持したい場合です。35 個のフィールドを持つフォームでミスを犯した経験はありますが、大量のエラー メッセージと新しい空白のフォームが表示されます。MVC フレームワークは、フォームに再入力できるように、以前に入力された情報を格納する場所として TempData を提供します。コントロールの内容の保存はほとんど自動的に行われたため、これは ViewState によって Web フォームで実際に非常に簡単になったものです。... TempData は、型指定されていない ViewData によく似た辞書です。ただし、TempData の内容は単一の要求に対してのみ有効であり、その後削除されます。

于 2010-06-23T15:42:52.703 に答える