2009-09-29 71 views
9

我有一個值,我想在單個請求期間成爲vaild。我沒有使用會話,因爲這會使整個導航會話的值爲全局值。ASP.net MVC - 請求範圍的全局變量

所以我把thie值放在一個類的靜態字段中。太好了,但後來我發現這些領域更加全球化,也就是說,他們爲整個應用程序保留着!這意味着導航會話之間可能存在隨機交互。

所以現在的問題是:是否有一個安全的地方,我可以把一個全局變量,完成請求復位後

  • 沒有受到任何這將是

    • 全球各地的請求其它的請求,或者是相同用戶的或由其他用戶

    由於 真知晶球

    編輯 我會詳細說明。我在母版頁中有一段代碼,在某些情況下我需要隱藏這些代碼,但我只能在控制器中知道這些代碼。我想到了在控制器中,然後將通過該母版頁查詢設置一個靜態變量,但現在我看到有可能是一個更好的辦法...

  • 回答

    10

    TempData可以持續到下一個請求,如前所述。

    但也有兩個其他字典的範圍限定爲單個請求。

    • {ControllerViewPage} .ViewData
    • Context.Items

    要從控制器通信,以ViewData(主)頁可能是更好的選擇。

    +0

    如果在請求生命週期中調用RedirectToAction,則'ViewData'和'HttpContext.Items'將被清除。在這種情況下,爲重定向請求保留的唯一選項是「TempData」。完成後,您只需要移除放在那裏的物品。 – 2015-04-30 17:44:32

    +0

    從那時開始'TempData'的工作方式發生了變化,現在'TempData'一直持續到它再次被讀取。所以使用'TempData'可能會導致一些奇怪的事情發生。 'ViewData'(和'ViewBag')不適用於將數據從子動作傳遞給父類(我認爲即使是部分視圖 - >父視圖),所以使用'Context.Items'是3中最好的。 – jahu 2015-09-17 08:37:38

    2

    兩種方法浮現在腦海中:

    1. 在你設置這個變量的地方創建一個基本控制器,然後讓你的所有控制器都繼承它。
    2. 使用TempData - 這裏的問題是它堅持下一個請求。但是也許知道這一點,你可以通過使用GUID鍵來確定你實際上在需要時獲得新的值。

    我可能會去1)。

    1

    在Controller(Action)中設置的MasterPage中訪問數據的常用方法是通過ViewData [「TheDataKey」] =「SomeValue」。

    23

    使用HttpContext.Items - 每個請求緩存存儲。查看4guysfromrolla上的this article瞭解更多詳情。

    它應該在ASP.NET MVC中正常工作。您可能希望從基類派生您的母版頁(通過代碼隱藏或使用Inherits指令),並在基類上有一個受保護的方法來檢查HttpContext.Items並返回,例如,取決於您是否要顯示條件碼,是true/false。

    +1

    +1比我的「將它添加到請求標題」的答案好得多,我還學習了somefink。 – 2009-09-29 13:07:02

    1

    這是相對容易的,有幾種方法可以實現 - 取決於您的網站的工作方式。

    我正在解釋您的請求,因爲您希望一個屬性或變量在請求期間存在,並且對控制器,模型和主控可見。

    ASP中的當前應用程序可以看到一個靜態屬性,這意味着一次連接的用戶負載,但不一定全部連接。 IIS將根據需要產生新的ASP應用程序。

    所以方法可以做到這一點:

    你可以有一個自定義的基類的母版頁或代碼隱藏頁(因爲所有的WebForms的東西仍然有效)

    你可以有一個爲您的控制器定製基類。

    你可以得到一個從其他,因此:

    void Page_Init(object sender, EventArgs e) 
    { 
        var ctrl = this.ViewContext.Controller as MyBaseController; 
        if (ctrl != null) 
        { 
         MyLocalProp = ctrl.PropOnMyController; 
        } 
    } 
    

    這一操作將在控制器和母版頁上按請求提供。

    0

    你看看tempData是附加到控制器類嗎?它是一個簡單的字典,通過一個請求保留它的價值。這意味着您的數據只能在控制器中訪問,但這不應該是一個問題。

    public class MyController : Controller 
    { 
        [AcceptVerbs(HttpVerbs.Get)] 
        public ActionResult MyAction(string id) 
        { 
        this.TempData["Message"] = "YourData"; 
        } 
    
        [AcceptVerbs(HttpVerbs.Post)] 
        public ActionResult MyAction(string Id) 
        { 
        var myData = this.TempData["Message"]; 
        } 
    } 
    

    這適用於我。我只用它來顯示警告信息和類似的東西。