我創建了一個視圖模型的ViewModels使用的SelectList設計Decison
public VMPosition
{
public VMPosition(){}//for model binder
public VMPosition(int EmployeeID)
{
PositionStatusList = new SelectList(_repo.getStatuses);
//populate other properties
}
public int CurrentPositionID { get; set; }
public int EmployeeID { get; set; }
public int CurrentPositionHistoryID { get; set; }
public bool AddingNew { get; set; }
public bool ClosingCurrent { get; set; }
public string CurrentPosition { get; set; }
public DateTime CurrentPositionStartDate { get; set; }
public string ReasonForDeparture { get; set; }
public SelectList PositionStatusList { get; set; }
}
我GET的ActionResult被定義爲
public ActionResult UpdatePosition(int id)
{
return View(new VMPosition(id));
}
我的帖子的ActionResult被定義爲
public ActionResult UpdatePosition(int id, VMPosition Position)
{
if(ModelState.IsValid){
Position Current = new Position{Position.Title etc..}
//save to db
return redirectToAction("someAction");
}
return View(Position);//here is the problem
}
我的SelectList填充在接受一個參數的構造函數中。如果模型狀態無效,ModelBinder不能也不應該調用構造函數。我將不得不返回視圖與模型對象(在這種情況下不包含SelectList值)。使用視圖模型時如何處理這種情況。
我可以在actionresult中手動填充這些值,但這會違反DRY原則。然而,就這個問題而言,我想幫助解決更大的設計問題。
感謝您的快速回復。在get中編寫列表代碼是個不錯的主意,但如果我們多次選擇它,是否會導致兩個單獨的查詢。我知道名單通常被稱爲查看一次,只是要求好奇! – 2010-12-02 13:11:57
@穆罕默德:我相信你的問題的答案是,它取決於。在我的情況下,我有一個具有已經創建的子對象列表的實體。我使用AutoMapper將實體的數據複製到視圖模型。當我查詢視圖模型的列表時,沒有數據庫交互性。但是,如果您依賴於IQueryable,則可能對列表進行查詢可能導致數據庫查詢。同樣的事情可以說,如果你通過直接訪問倉庫建立你的列表 - 在這種情況下,你可以使用視圖模型的構造函數來填充本地列表一次? – Mayo 2010-12-02 13:16:48