3

我正在開發一個MVC3項目,我注意到當記錄從UI更新時,數據庫中的某些字段被設置爲null。發生這種情況是因爲這些字段不在表單上。我知道這可以通過爲這些添加HiddenFor項來解決,但這不是一個好方法,因爲任何新字段都需要添加到那裏。我希望找出一個更好的解決方案。MVC3數據丟失時不在表單上發佈?

的項目是如何構成的一個小的闡述:

我們有匹配的EF實體正好簡化測繪的DTO。所以DTO具有存在於實體&數據庫中的每個字段。我們使用DTO作爲我們的模型。

控制器將DTO傳遞給服務層。服務層將DTO映射到其相應的實體(使用AutoMapper),並將其傳遞到持久層。持久層是實際使用DbContext保存更改的內容。

假設我們有一個帶有名稱成員和FolderPath成員的Client DTO,並且只有名稱成員在其表單上。表單帖子,並且該FolderPath爲空。該值始終保留在持久層的更新中。我必須指出,我不希望那個特定的值覆蓋數據庫中的內容。

從我已經收集的SO研究這個了大約一個小時,一個方法可能是......

  1. 保持的DTO最小範圍,針對特定的一組,我們 知道我們的領域將在一個視圖中的形式。
  2. 告訴AutoMapper忽略 任何存在於目標而不是源per this answer.
  3. 在服務層,映射DTO到 實體時,首先從數據庫檢索現有的實體。映射 將只覆蓋作爲DTO的一部分的成員, ,並且任何其他值將從數據庫檢索 以來將保留。

這是一個有效的方法嗎?有沒有更好或更常見的方法來解決這個問題?

回答

2

我會選擇1並具有視圖/ html格式特定的模型。這是最乾淨的解決方案,恕我直言。

還有一個主要問題是,其他方式會讓你打開黑客攻擊......也就是說,如果我知道模型上的其他字段/屬性,我可以使用該信息製作一個表單文章並將其保存。

+0

我的意思是把數字當作一個解決方案的步驟而不是獨特的選擇,因爲我認爲它們對實體中的所有成員都是必要的,但對DTO來說卻是不可能存在的。此外,這是一個僅限少數人使用的僅限Intranet的應用程序,因此黑客問題不是太重要。 – 2012-08-08 16:24:14