2012-02-13 138 views
0

ASP.NET MVC 3.0新增功能。請求專家對下面提到的方案的看法。ASP.NET MVC 3.0 - 維護模型狀態

我有一個客戶詳細信息頁面,其中只有名稱是可編輯的。還有10個其他客戶屬性不可編輯,並使用SPAN顯示。當用戶提交頁面時,我只需要更新名稱。

如果使用EF,我將不得不再次加載客戶,覆蓋名稱,然後保存。否則,我將不得不在某個地方維護客戶模型。

任何人嘗試使用會話ID緩存模型(或viewmodel)?這是一個好習慣嗎?

+1

我不確定你到底在問什麼。 – 2012-02-13 11:51:33

+0

讓我試着更具描述性:我有一個客戶詳細信息視圖,顯示一個客戶記錄,只有名稱可編輯。還有其他客戶詳細信息,例如電子郵件,電話等,這些信息是不可編輯的,並使用跨度顯示。當用戶編輯名稱並提交頁面時,模型會嘗試更新數據庫中客戶的詳細信息。 – user1206686 2012-02-13 12:14:25

回答

1

你幾乎在正確的方向思考。

如果使用EF,我將不得不再次加載客戶,覆蓋名稱然後保存。否則,我將不得不在某個地方維護客戶模型。

在更新方法**恢復客戶一次僅在需要時再保存

**有2個原因

  1. The first and most important rule is 'don't trust user data'.
  2. 併發,避免更新名稱保存舊數據。 See this example

而不是使用會話,我會建議使用隱藏字段備案LastUpdateDateTime和用戶ID將在模型調回檢索記錄,並與數據庫記錄驗證LastUpdatedtime

0

通常,您應該使用不同於數據庫模型的視圖模型。話雖如此,在您目前的情況下,情況非常簡單,只需向控制器提交名稱,然後使用提交的名稱設置您從EF獲得的對象的Name屬性。

緩存視圖模型或模型不是你關心的問題。數據庫模型緩存由EF處理,您的問題主要是缺乏明確的應用程序分層。事實上,我強烈建議學習更多關於MVC模式,基本應用程序體系結構(2-3層)以及何時以及如何使用OR \ M(EF是)的信息。

0

採用隱藏式輸入,用於其他屬性在你的形式。通過這種方式,您可以獲得綁定到EF實體的所有屬性,並且不需要從數據庫再次獲取實體。或者您可以序列化實體(如果您使用POCO實體)並設置爲隱藏輸入。當你回發你應該反序列化實體。

我的選擇永遠是第一位的。 :)