2016-09-30 32 views
1

我看到對「最佳實踐」的引用,但爲什麼在訪問視圖中的靜態數據時使用ViewBag對象與Application對象更好?爲什麼在視圖中使用ViewBag代替Application [「x」]?

兩者都是可能的。假設你想爲每個視圖添加一個對象,但不一定會傳遞它來查看模型(因爲甚至可能沒有給定視圖的模型)?

這可以通過多種方式完成,就像使用全局過濾器一樣,但訪問應用程序變量會更方便。

回答

1

這兩個都是令人討厭的解決方法,它繞過了MVC所代表的一切。

在Model-View-Controller模式,你的控制器準備包含所有必要的填充查看值的模型,並依次查看顯示的模型屬性它的意圖的方式。

您使用來規避這種模式,像ViewBag,Session或Application變量的任何方式,是反模式是打敗MVC方式 - 只要你直接從瀏覽訪問這些變量。

另請參閱Pass data to layout that are common to all pagesCreate ViewModel for Navigation:如果您在所有頁面上都需要某些值,請考慮使用基本視圖模型或部分視圖。

是的,這個討論與實用主義/純粹主義接壤。例如,如果您的菜單對於每個用戶都是相同的,但是從數據庫加載的菜單相同,那麼請確保將其存儲在Application變量中以進行緩存,以便爲每個AppDomain加載一次。但是,仍然使用基本的ViewModel或Partial來渲染該菜單。

1

我不會說將數據放入視圖包中是最佳實踐。我會說使用視圖模型是一種最佳實踐。

假設你要添加對象每個視圖,但不一定通過 它來查看模型(因爲有可能甚至是對給定 視圖模型)。

即使您沒有定義視圖模型,概念上也有一種模型是您將數據傳遞給視圖。

Why do we use ViewModels?

如果數據是在每個視圖,您可以創建每一個模型繼承包含通用數據基礎視圖模型。

您也可以使用自己的視圖模型創建一個局部視圖,然後將其應用於每個頁面。

0

如果您在應用程序中存儲了許多和/或大對象,則存在內存不足的風險。

您應該只把應用程序收集的對象,你知道,他們應該爲那些不只是使用一個單頁或會話的應用程序,而不是整個壽命活着。 (您還應該注意,如果應用程序池處於非活動狀態或配置的時間間隔之後,該應用程序可能會被關閉)

如果您在應用程序中放置/刪除多個對象並在代碼中的許多不同位置執行此操作,邏輯往往難以遵循。

0

通常我會考慮應用程序的業務或功能概念來設計ViewModels。 例如,如果您要顯示發票,則視圖模型應包含與需要在特定視圖上顯示的發票相關的所有屬性。爲此,我不會使用ViewBags/ViewData。

在ViewBag上,我通常會放置其他和「更多輔助」屬性,例如,顯示/隱藏視圖的某些部分的布爾值,或者可能用於某些其他「與業務無關」的屬性。

當然,有些人可能會不同意這一點,並會將所有內容放在Viewmodels上,而其他一些則不會。這是您在開始時必須做出的決定,因此您可以在整個應用程序中設計的方式保持一致。

相關問題