2012-03-26 57 views
3

我有一個MVC 3應用程序,我創建了一個通用的包裝對象,它具有一些導航屬性和T的包裝對象,其值我編輯/顯示。MVC 3在HttpPost行動拆分參數

public class NavigationViewModel<T> 
{ 
    public T Model { get; set; } 
    public NavigationHelper NavigationHelper { get; set; } 

    public NavigationViewModel() { } 

    public NavigationViewModel(T model, NavigationHelper helper) 
    { 
     this.Model = model; 
     this.NavigationHelper = helper; 
    } 
} 

我的控制器在這樣一個動作很好地解決了這個對象:

public ActionResult Foo(NavigationViewModel<Bar> viewModel) 

代碼在我看來是這樣的:

@Html.EditorFor(model => model.Model.SomeProperty) 

我的同事說,該代碼是不是很好讀書。我已經有了一個強類型視圖,模型和這個模型有另一個叫做Model的屬性。他建議將Model屬性重命名爲ViewModel,我同意他的推理。

現在,帶有重命名屬性的代碼不再有效:NavigationViewModel viewModel爲null。所以我改變了HttpPost方法的簽名下面並再次將其工作原理:

[HttpPost] 
public ActionResult Foo(NavigationHelper helper, Bar viewModel) 

我喜歡這種非常感謝!我可以在代碼中直接訪問我的viewModel,視圖中的代碼很有意義,幫助對象不會妨礙。我之前沒有看到過這個約定,我想這是因爲命名約定以前的工作。使用一個名爲Model的屬性暗示瞭如何解析對象。沒有這個財產,它不能再解決它。

我想對其他類型的助手包含特定於視圖的屬性,如選擇列表或其他屬性,否則我可能會放在ViewBag中。你們會推薦這種方法,還是會在以後使用時遇到麻煩?

+0

泛型很好,但通常它們會導致過度工程。你想達到什麼目的?關於命名約定,我認爲你的同事是對的,但只是稱它爲視圖模型解決了一半的問題。我希望能夠通過查看其名稱和屬性來確定課程的目的。 – 2012-03-26 15:54:21

+0

導航視圖模型是一種標記各種信息的工具,比如按下哪個按鈕來引起回發,以及如果我想顯示按鈕(我們正在設計一個非常動態和怪異的流程)。我可以重用這部分,讓視圖模型T可以互換。將它稱爲視圖模型可能沒有更清晰,但它讓我發現,可以使用/濫用/欺騙模型綁定器來解析兩個對象,而不是使用內部對象的包裝器。 – Vincent 2012-03-26 16:00:06

+0

這聽起來像是設計問題。糾正我,如果我錯了,但你說你想跟蹤用戶正在使用的頁面的狀態。如果是這樣的話,那麼Web表單可能是更好的解決方案。另外,用MVC聽到「後衛」聽起來是錯誤的。也許嘗試分享有關您設計的更多信息?無論哪種方式,這是非常有趣的,它會很高興看到更多的意見。 – 2012-03-26 16:06:48

回答

0

我覺得我對你有一個非常簡單的答案,只是不命名動作參數視圖模型,所以更改:


public ActionResult Foo(NavigationViewModel viewModel) 

public ActionResult Foo(NavigationViewModel model) 

或任何其他參數名稱不與您的視圖模型碰撞您的NavigationViewModel類的屬性。