MVC在视图之间传输数据

时间:2010-06-23 15:27:50

标签: model-view-controller view transfer

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

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

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

当用户插入新项目时,它会使用httpverb post发布到Create操作并创建该项目并使用RedirectToAction方法返回到List操作。

但我无法以此样式向用户显示任何消息(错误,信息等),因为我无法在Create action和List action之间传递数据。我怎么能这样做?

3 个答案:

答案 0 :(得分: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. ImportModelStateFromTempDataExportModelStateToTempData 属性有助于传递模型 重定向之间的状态错误。此
  2. <% ViewContext.FormContext.ValidationSummaryId = "valSumCreateForm"; %>将MVC表格与其相应的验证摘要相关联。


  3. 你也可以在这里查看我的另一个答案。 ViewModel with SelectList binding in ASP.NET MVC2


    如果您有任何疑问,请与我联系 -Soe

答案 1 :(得分:0)

为此,大多数MVC框架都能够通过下一个请求临时存储一小部分数据。在ASP.NET MVC中,它称为TempData,在Rails中称为:flash等。

答案 2 :(得分:0)

This article说明了如何使用 TempData

  

其中一件比较烦人的事情   处理Web编程是错误的   在表格上。更具体地说,你想要的   显示错误消息,但是你   想要保留以前输入的内容   数据。我们都有过这样的经历   在有35的表格上犯了一个错误   字段,只提供一个   一堆错误消息和一个新的,   空白表格。 MVC框架提供TempData作为存储先前输入信息的位置,以便可以重新填充表单。这是   ViewState实际上做的事情   Web表单非常容易,因为保存   控件的内容很漂亮   非常自动化。 ... TempData是一本字典,   很像无类型的ViewData。   但是,TempData的内容只是   然后为一个请求而活   他们被删除了。