2010-05-18 58 views
0

嗨我有一個關於模型綁定的問題。假設你有一個現有的數據庫實體顯示在一個表單中,並且你想編輯一些細節,一些屬性例如createddate等沒有綁定到表單,在模型綁定過程中,這些屬性沒有分配給模型,因爲它們沒有http post數據或querystrong等,因此它們的屬性爲空。在我的更新控制器的方法,標識只是喜歡做在更新實體場景中的asp.net mvc自定義模型綁定

公衆的ActionResult更新(實體耳鼻喉科) {// 將更改保存到數據庫 }

但有些性能是耳鼻喉科空,它們將覆蓋現有數據庫字段不是表單發佈數據的一部分,處理此問題的正確方法是什麼?我曾嘗試使用隱藏字段來保存數據,但模型綁定似乎並未將隱藏字段分配給模型。任何建議,將不勝感激

回答

1

你不應該發送你的實體到你的觀點,你應該發送它的瘦身版本稱爲DTO(數據傳輸對象)或ViewModel。

只發送屬性到視圖(並因此發回的形式),您希望用戶使用該操作進行更新。

在您的POST處理程序中,您可以驗證並將屬性複製到您的實體。

的AutoMapper可以幫助,如果你有大量的屬性

類似:

public class User 
{ 
    int id; 
    string name; 
    string email; 
} 

public class EditUserEmailDto 
{ 
    string email; 
} 

// get 
public ActionResult EditEmail(int id,) 
{ 
    return View("EditEmail", new EditUserEmailDto()); 
}  

// post 
public ActionResult EditEmail(int id, EditUserEmailDto dto) 
{ 
    if(!ModelState.IsValid) 
     return View("EditEmail", dto); 

    var user = userRepo.Get(id); 
    user.email = dto.email; 
    userRepo.Save(user); 

    return; 
} 
+2

這是有道理的安德魯,感謝您的回覆。我認爲你的解決方案在一個簡單的情況下工作,當你使用自定義模型聯編程序時,既適用於保存和更新方案,也需要將值分配給類型而不是viewdata。你將如何處理? – mctayl 2010-05-18 21:10:34

+0

而且你會如何利用模型驗證等功能? – mctayl 2010-05-18 21:20:15

+0

重新評論:不知道我明白你的意思,你能解釋一下這個問題嗎?重新第二評論,我做我的驗證在活頁夾,這樣它使郵政處理程序整潔。不適當更新答案以顯示處理程序的示例,但驗證位在這裏可能會過度。基本上,我擴展了'DefaultModelBinder',重寫'BindModel',調用'base.BindModel',然後從我的IoC容器中爲模型類型獲取驗證器,驗證模型,然後在ModelState中粘貼任何錯誤 – 2010-05-19 09:14:50