2009-08-22 94 views
0

此刻,我重寫了ASP.NET ViewPage的OnLoad事件。這樣一個對象可以與所有的視圖頁共享。但是我現在需要能夠訪問控制器中的該對象;最好的辦法是什麼?如何在控制器和視圖頁面之間共享對象?

本質上,我想與視圖頁面和控制器共享一個對象(對於Web應用程序的每個用戶來說都是唯一的...所以singleton不在)。

謝謝!

回答

1

我不確定您是否希望維護整個用戶會話的對象引用,或者您是否只希望爲單個請求提供引用。無論哪種方式,你可以使用Global.asax中獲取對象的範圍將你的控制器和視圖的使用方法:

首先,請求範圍的對象:

的Global.asax.cs:

protected void Application_BeginRequest(object sender, EventArgs e) 
{ 
    var myObject = SomeMethodThatGetsMyObject(); 
    HttpContext.Current.Items.Add("MyObjectKey", myObject); 
} 

protected void Application_EndRequest(object sender, EventArgs e) 
{ 
    HttpContext.Current.Items.Remove("MyObjectKey"); 
} 

然後在控制器,你可以像這樣訪問此:

public ViewResult ThisAction() 
{ 
    var myObject = HttpContext.Current.Items["MyObjectKey"] as MyObjectType; 
    // placing this in view data provides easy access in the view. 
    ViewData["MyObject"] = myObject; 
    return View(); 
} 

然後在視圖中,你可以從ViewData的,或directl訪問此從HttpContext的

<% var myObject = ViewData["MyObject"] as MyObjectType; %> 

<!-- If for some reason you don't want it in view data 
you can use the HttpContext directly instead --> 

<% var myObject = HttpContext.Current.Items["MyObjectKey"] as MyObjectType; %> 

次Y,會話範圍的對象:

這種方法將保持在範圍內的對象,直到該用戶的會話結束。從HttpContext的

public ViewResult ThisAction() 
{ 
    var myObject = Session["MyObjectKey"] as MyObjectType; 
    // placing this in view data provides easy access in the view. 
    ViewData["MyObject"] = myObject; 
    return View(); 
} 

然後在視圖中,你可以從ViewData的訪問它,或者直接:

的Global.asax.cs

protected void Session_Start(object sender, EventArgs e) 
{ 
    var myObject = SomeMethodThatGetsMyObject(); 
    Session["MyObjectKey"] = myObject; 
} 

protected void Session_End(object sender, EventArgs e) 
{ 
    Session.Remove("MyObjectKey"); 
} 

然後在控制器,你可以像這樣訪問此

<% var myObject = ViewData["MyObject"] as MyObjectType; %> 

<!-- If for some reason you don't want it in view data 
you can use the Session directly instead --> 

<% var myObject = Session["MyObjectKey"] as MyObjectType; %> 

最佳實踐

值得一提的是,一些最佳實踐可以用來改善這種設計。首先,不是在視圖中傳遞和使用整個對象,而是通常將所需的值傳遞到視圖數據中,以保持視圖不被賦值和投射代碼。(請記住,如果您要在視圖中投射,您將不得不在處理視圖時處理投射失敗的潛力!)

此外,渴望擁有始終可用的用戶範圍對象「以防萬一「是一種反模式。瞭解這個對象的目的是什麼可能是有用的,以便根據已知的最佳實踐可能建議一種適當的模式來幫助解決您的問題。

我希望在這個地方能夠幫助一點點。

0

把它放在你的控制器的基類中?老實說,你的設計聽起來有缺陷......某種「神物」已經在你的設計中找到了方法。如果你問一個更好的方式來做你在做什麼,你可能會得到一些更好的答案...

0

這聽起來像你想傳遞一些會話變量到你的意見。也許最好的方法是創建一個基礎視圖模型類,它可以從會話對象中爲你加載這些信息。然後可以使用此基礎對象爲每個視圖構建定製的視圖模型類。

+0

我不知道,如果這是你的意思到底是什麼,但這樣的事情是SessionFacade。示例:http://www.codeproject.com/KB/aspnet/session_facade.aspx – 2009-08-22 23:36:30

0

我同意Will的說法。將對象粘貼在主控制器派生的基本控制器類中。

看看這裏,看看別人怎麼說>>ViewModel-Best-Practices

相關問題