我刚刚开始学习MVC,并试图了解它是如何工作的。
我不想将用户发送到所有编辑,插入和列表操作的不同视图。
在我的示例应用程序中,View包含一个项目列表,在列表下方有一个表单(用于插入新项目),其中包含“{Controller} / Create”操作,但没有创建视图。
当用户插入新项目时,它会使用httpverb post发布到Create操作并创建该项目并使用RedirectToAction方法返回到List操作。
但我无法以此样式向用户显示任何消息(错误,信息等),因为我无法在Create action和List action之间传递数据。我怎么能这样做?
答案 0 :(得分:4)
您需要使用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表格与其相应的验证摘要相关联。
你也可以在这里查看我的另一个答案。
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的内容只是 然后为一个请求而活 他们被删除了。