2011-02-24 53 views
1

我很好奇,如果綁定模型直接作爲參數在行動方法被認爲是壞主意?綁定域模型直接是一個壞主意?

如果表格變得複雜,我可以創建一個自定義模型聯編程序。

有沒有使用這種方法的任何坑?

我想避免創建viewmodel,因爲我想讓我的app儘可能簡單。我想避免重複代碼和模型視圖到模型綁定。

回答

3

我建議幾乎總是使用視圖模型。

如果您使用的是默認的對象模板...他們不太喜歡非平面模型,雖然您可以重寫它們,但並不總是一個好主意。領域模型通常不是平坦的。無論哪種方式,基於ModelMetaData的任何東西都比ViewModel更容易。

使用ViewModel進行驗證也更容易,因爲您已經有了更加專注的模型,有時候驗證只在某些視圖中才有意義。

創建ViewModels比使用JsonResult發送模型好得多,也更安全...呃...即使您不使用ViewModel,也不應該發送域模型。但是當您準備好ViewModel時,使用JsonResult會更容易。當您習慣於在任何地方使用您的域模型時,犯錯誤和暴露敏感信息也更​​容易。

更改有時更容易,因爲更改域模型上的屬性並不意味着您必須更改所有視圖,只需更改ViewModel的創建(如果您使用某種映射器,那只是一個改爲綁定),儘管這不是IMO的強項。

其他一些優點是將表示層與業務層分離,如果使用EF或非poco對象,則在視圖中使用它們會更困難。

如果你想消除重複的代碼,你可以考慮創建自動創建ViewModels的過濾器,甚至不用動作,使用映射器的過濾器消除了大量的代碼重複。

順便說一句,我看不出如何創建自定義模型綁定比使用ViewModels更簡單。

3

不一定。但很快你會發現一些需要在模型上的狀態,但是是特定於UI的,並且最終你最終創建一個ViewModel。

也爲一些屬性,如DateTime,這將不能很好的示範,如果定義爲DateTime因爲不存在與使它可選的,所以你必須把它定義爲string問題的工作。我不相信你想要約會string約會。

此外,對於DropDown項目,您需要在模型上有SelectListItem的模型集合,這對模型沒有意義。

這就是發生在我身上的事。

+0

對於可選日期,我可以使屬性爲空,並通過其他操作方法通過ajax加載我的下拉列表項。 – user256034 2011-02-24 09:58:50

+0

是的,你可以。但就模型而言,它是否真的可以約會呢?如果是這樣,那麼你很好。我也爲我的下拉菜單使用AJAX。 – Aliostad 2011-02-24 09:59:55

1

我會建議你總是創建一個ViewModel。在其最簡單的形式中,它可能僅包含一個包含域對象(和附件數據)的屬性。喜歡的東西:

public class DomainModelClass 
{ 
    int Property1 { get; set; } 
    int Property2 { get; set; } 
} 

public class ViewModelClass 
{ 
    DomainModelClass DomainModel { get; set;} 

    SelecList List1 { get; set; } 
} 

不管怎麼說,這個建議只是爲了讓事情變得簡單,因爲我會建議你創建一個「真正的」視圖模型,並使用類似AutoMapper映射視圖模型< - >的DomainModel,即使在一個簡單的場景。

+0

不知道你是否仍然在監視這個問題,但... 我喜歡這個想法,但擔心我不能再讓巫師支持我對我的看法。有沒有辦法讓強類型的腳手架嚮導進入視圖模型並生成DomainModel的Razor代碼? – Joe 2011-09-13 10:45:31

+0

不確定配偶。抱歉 – psousa 2011-09-14 15:51:37

相關問題