2016-05-10 37 views
0

因此,我從_ViewStart.vbhtml中獲取了一些數據,我正在撥入ViewContext.ViewData如何在MVC中獲取當前ViewContext

喜歡的東西:ViewContext.ViewData("__Stuff") = stuffObject

從沒有查看或MVC或相關的任何網絡架構的概念類

現在,我想抓住當前ViewContext。

類似的方法你可以做HttpContext.Current,我想問一下目前的ViewContext

到目前爲止,我通過HttpContext搜索沒有收到結果。

是的,我知道我可以從需要此數據的視圖注入ViewContext。但是這比不具有可以在沒有注入的情況下找到它的函數更不可取。

+0

您是否需要這些數據保留在多個帖子/獲取的會話中? –

+0

@Young先生:我不知道。每次渲染_ViewStart頁面時,都會設置ViewContext.ViewData。這個功能比我在我的問題上發佈的還要多 - 但我試圖簡化它以回答這個問題。 –

回答

2

我想你可能會走運。通常情況下,您可能知道,視圖是行結束。大多數組件不知道視圖要運行到什麼時候才運行。我知道你不願意傳遞這些信息,但也許你可以使用類似actionfilter的信息將信息添加到HttpContext中。

Public Class ViewDataInjectionAttribute 
    Inherits ActionFilterAttribute 

    Public Overrides Sub OnActionExecuted(ctx As ActionExecutedContext) 

     Dim result = TryCast(ctx.Result, ViewResult) 
     If result IsNot Nothing Then 
      HttpContext.Current.Items("viewData") = result.ViewData 
     End If 

     MyBase.OnActionExecuted(ctx) 
    End Sub 

End Class 

然後,您可以在動作,控制器甚至全局應用過濾器。

+0

不錯的想法@Rob。我知道我想要做的不是傳統上/通常會做的事情。我可能會在未來選擇不同的架構。這是一種有機的 - 試圖將這個特性強加到現有的大型代碼庫中。所以感謝你的屬性想法..我以前沒有想到這一點。 –

+0

花點時間考慮屬性雖然..屬性通常應用於控制器操作。視圖,作爲一種文本文件 - HTML和代碼混搭,根據我所知,沒有適用屬性的地方。並且Action不必爲所有代碼路徑返回相同的視圖。你可以有條件地返回不同的意見。有什麼值得思考的。再次感謝。 –

+0

同意你不能在視圖上放置一個動作過濾器,但是,你正在處理每一個視圖的_viewstart。可以在全球範圍內添加一個操作過濾器以實現相同的結果。 – Rob