2009-08-22 93 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

相关问题