2014-02-12 47 views
8

這更是一個通用的架構問題:ViewBag和模型,在MVC.NET

我試圖決定它是否可以爲我的程序員使用「ViewBags」將數據傳遞到的意見已接受模型。

我個人的偏好是避免ViewBags和構建包含所有的數據的魯棒模型的視圖需要:

方法1:

MODEL A: 
- List of Employees 
- Nullable integer, indicating which item from the list is currently selected 
- string firstName (empty if index is null) 
- string lastname (empty if index is null) 

方法2:

MODEL A: 
- List of Employees 

ViewBag: 
- ViewBag.Index (indicating which item from the list is currently selected) 
- ViewBag.FirstName 
- ViewBag.LastName 

任何人都可以想到爲什麼Approach2會比Appr更好的一個論點oach 1?

感謝您的輸入

回答

2

你能用它嗎?當然。你應該使用它嗎?取決於你想做什麼。通常你會看到ViewBag保留用於發送數據的頁面標題或其他內容。您可能想要將保存在數據庫中的參數保存在模型中。主要是因爲模型綁定以及您是否想要執行模型驗證。

3

當將信息傳遞給您的視圖佈局

5

個人而言,我會選擇型號爲參數,因爲模型是強類型的,所以當它經過查看,我們也可以控制我們的參數是否有效的字段關鍵字。 模型是未來代碼維護的最佳方式。

參考此:

Avoid Viewbag

0

這要看是什麼情況,如果一個人想通過字段將在這個特定視圖中只使用,他們可能不會被製成一個實體的一部分或一個模型,然後我會去viewbags,否則我會讓它成爲一個模型。

+2

請具體說明你的答案,具體推理你爲什麼選擇什麼而不僅僅是意見。 –

11

在我看來,你應該從未使用ViewBag沒有一個非常,非常好的理由Brad Thomas' answer指出了一個很好的例子。

假設您有一個由整個網站共享的主人layout(或partial view)以及數十個各自擁有自己的模型的強類型視圖。你如何將數據傳遞給佈局?我見過的一些策略:

  1. 將佈局屬性添加到每個模型。

如果你沒有很多的模型,或者它只是一個或兩個額外的屬性,這可能工作。這可能很快成爲維護噩夢。

  1. 讓所有模型都繼承自包含佈局數據的類。

我避免創建ModelBase類,但有時可能有必要。

  1. 爲佈局和通用模型基類創建一個模型。

我已經看過MVC應用程序的幾個佈局,任何視圖可以利用。如果您的模型從基類繼承,則可能需要爲每個佈局設置一個基類。爲了避免重複工作,我會爲每個佈局創建一個佈局模型。然後,這樣的事情可能會爲你工作:

abstract class ModelBase<TLayout> { 
    public TLayout Layout { get; set; } 
} 

class Model : ModelBase<LayoutModel2> { /* model stuff here */ } 
ViewBag
  • 認沽佈局屬性。
  • 有幾種情況我可以想像在模型中放置佈局信息不是正確的調用。例如,人們使用域模型作爲他們的模型似乎很平常,您可能不希望將佈局/視圖數據與業務/域數據混合使用。


    如果你決定使用ViewBag,避免這種情況:

    ViewBag.Title = "My page" 
    ViewBag.UserID = 123 
    ViewBag.UserName = "admin" 
    ViewBag.UserDisplayName = "Administrator" 
    

    有明顯的潛在問題,如在不同的地方(例如的替代UserIdUserID)使用大寫字母不同。不太明顯的是,有人可能會不小心設置ViewBag.UserIDstringNullable<int>

    class SomeOtherClass { 
        public string UserID { get; set; } // someone uses a string... 
    } 
    
    ViewBag.UserID = someOtherClassObj.UserID; // now you're in trouble. 
    

    所以,如果你必須使用ViewBag,我建議是這樣的:

    ViewBag.LayoutModel = new LayoutModel { UserID = User.ID, UserName = User.Name }; 
    
    +1

    我也發現立即將它恢復到其相應的.cshtml文件頂部的原始類型也可以簡化ViewBag的一些問題。 – foresightyj