2011-04-12 71 views
12

我意識到最好的做法是使用強類型視圖並傳遞ViewModel中所有需要的數據,但我很好奇是否存在實際上被認爲是「最佳實踐」的ViewBag/ViewData中傳遞數據的情況。什麼時候在ASP.NET MVC中使用ViewBag/ViewData「可以接受」?

在什麼情況下ViewBag/ViewData首選將數據傳遞給視圖?

更新

我們很高興地聽到各種用途每個人都拿出了ViewBag/ViewData的。我們可能永遠不會達到「最佳實踐」,但能夠看到人們依賴ViewBag/ViewData提供的不同解決方案將非常棒。

回答

9

我使用它們很少,對於一些完全無關的,我正經過到視圖模型或視圖模型的信息位,再次,大部分的時間我使用視圖模型

+1

如果您將信息傳遞給視圖的佈局,那麼我可以看到的只有當視圖模型中不包含信息時才能看到的唯一場景。對於這種情況,我喜歡使用基本ViewModel,它由屬於所有使用特定佈局的視圖的ViewModel繼承。 – SamStephens 2011-09-05 04:53:48

2

我更喜歡使用一些DTO,而不是使用viewbag。使用DTO可以讓你強大的輸入你的viewdata。

希望這會有所幫助。

+0

你會使用這個方法,除此之外還是代替強制輸入視圖?爲什麼不直接將視圖鍵入到DTO(或從其派生的視圖模型)? – stephen776 2011-04-12 15:50:22

+0

這就是我所做的,我用DTO強烈地輸入了我的觀點。我儘量避免使用視圖包。但在某些情況下,如錯誤,你可以將它們傳遞給viewbag – alexl 2011-04-12 15:53:02

1

我不能說最佳做法,但我主要在使用編輯器模板時使用它。例如,如果我想顯示的下拉列表編輯某些領域我提出以下編輯模板

<%:Html.DropDownList("GetIDHere", new SelectList((IEnumerable<someModel>)ViewData["xyz"]),"select Author")%> 

那你就把UIHint屬性對你的模型的BookID領域例如

public class Book 
{ 
    public int BookID{get;set;} 
    [UIHint("mytemplate")] 
    public int AuthorID{get;set;} 
} 

在這種情況下,我假設,它使用ViewData特別精細和乾淨。這是Telerik asp.net mvc項目在其演示項目中編碼的方式demo

+1

有一個參數可以用來代替使用一個ViewModel,一個'Book'屬性和一個'IEnumerable '屬性,給你強大的輸入。 – SamStephens 2011-09-05 04:31:47

2

我通常會使用強類型視圖來顯示任何內容,但通常會將ViewBag.Member設置爲當前登錄的成員,以便可以使用它在主佈局中除了具體的視圖外。

我有一個名爲PopulateMemberContext的屬性,它填充ViewBag.Member,我該屬性添加到我的基本控制器讓每一個視圖總是有必要的數據。

「正確」或「錯誤」我不知道 - 但它奇妙地工作。

+2

這就是User.Identity屬性的用途 - 只要您的自定義身份驗證機制是MembershipProvider的實現,就會工作。 – 2012-12-07 13:59:16

相關問題