2

我刚开始学习 MVC 并试图了解它是如何工作的。

我不想将用户发送到所有编辑、插入和列表操作的不同视图。

在我的示例应用程序中,一个视图包含一个项目列表,在列表下方有一个表单(用于插入新项目),操作为“{Controller}/Create”,但没有创建视图。

当用户插入一个新项目时,它使用 httpverb post 发布到 Create 操作并创建项目并使用 RedirectToAction 方法返回到 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 andExportModelStateToTempData 属性有助于在重定向之间传输模型状态错误。这
  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 编程中要处理的更烦人的事情之一是表单上的错误。更具体地说,您希望显示错误消息,但希望保留以前输入的数据。我们都有过在一个有 35 个字段的表单上犯错的经历,结果却是一堆错误消息和一个新的空白表单。MVC 框架提供 TempData 作为存储先前输入的信息的位置,以便可以重新填充表单。这实际上是 ViewState 在 Web 窗体中非常容易实现的,因为保存控件的内容几乎是自动的。... TempData 是一个字典,很像无类型的 ViewData。但是,TempData 的内容仅适用于单个请求,然后会被删除。

于 2010-06-23T15:42:52.703 回答