查看

2010-06-23 15 views
2

MVC之間傳輸數據我剛開始學MVC,我試圖瞭解它是如何工作的。查看

我不想向用戶發送的所有編輯,插入和列表操作不同的看法。

在我的示例應用程序中查看包含項目的列表,並在列表下方有一個表單(插入新項目)與行動「{}控制器/創建」但目前還沒有創建視圖。

當用戶插入一個新項目時,它將發佈到具有httpverb發佈的創建操作,並使用RedirectToAction方法創建該項目並返回到List操作。

但我不能顯示任何消息(錯誤,信息等),在這種風格的用戶,因爲我無法通過創建行動和列表行動之間的數據。我怎樣才能做到這一點?

回答

0

大多數MVC框架有,暫時存儲數據的一小位剛剛通過的下一個請求只是這個目的的能力。在ASP.NET MVC其所謂的TempData,在Rails中,它被稱爲:閃光燈等

+0

Tempdata不是最好的選擇,應該避免它。請參閱以下爲什麼tempdata不好:http://jonkruger.com/blog/2009/04/06/aspnet-mvc-pass-parameters-when-redirecting-from-one-action-to-another/ – 2011-06-09 12:36:03

+0

In在你提到的文章中描述的例子中,TempData仍然在使用,它只是被包裝,因此它沒有被明確地引用。即使在這種方法中,TempData也是傳遞這類數據的正確機制;區別在於你如何使用TempData。 – 2011-06-10 17:12:48

0

This article介紹瞭如何使用TempData的:Web編程

一個更煩人的事情 處理在窗體上出現錯誤 。更具體地講,你要 顯示錯誤消息,但你 要保留以前輸入的 數據。我們都有過 在包含35個 字段的表單上犯了一個錯誤,只會顯示一個 錯誤消息和一個新的空白表單。 MVC框架提供TempData作爲存儲先前輸入的信息的地方,以便表單可以重新填充。這是 ViewState實際上在Web窗體中實際上製作了 非常簡單,因爲節省了 控件的內容非常自動地爲 。 ... TempData是一個字典,非常類似於未分類的ViewData。 但是,TempData的內容只有 可以存在一個請求,然後 它們被刪除。

4

您需要使用發佈重定向獲取PRG模式。

請通過卡子門祖爾拉希德閱讀這篇博客這個使用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表單與其相應的驗證摘要關聯。



您可以通過我在此點擊此處查看其它答案爲好。 ViewModel with SelectList binding in ASP.NET MVC2


讓我知道你是否有任何問題。
-Soe