假设我有一个类似于每个尝试访问我网站的用户的对象。 一种Session Scope对象,应该在我的整个“应用程序”中的每个View / Model / Controller上都可见。
当我调用一个页面并通过来自我自己的数据库的数据填充它时,我想创建它。
比,在View(例如)上调用myObject.Title。 在WebForms上我正在做这个扩展UserControl的类,例如:
public class iUserControl : System.Web.UI.UserControl
{
protected MyCurrentPage myCurrentPage;
public iUserControl()
{
}
protected override void OnLoad(EventArgs e)
{
myCurrentPage = new MyCurrentPageWrapper();
}
}
,对于每个UserControl,比这样的事情:
public partial class context_pippo_MyOwnUserControl : iUserControl
MVC上的我看不到每个控件的任何扩展名,所以我怎样才能实现这种过程呢?我想摆脱在Session上存储元素。
答案 0 :(得分:0)
如果我理解正确的问题,我想我在一个项目中做了类似的事情。 我有这样的事情:
public interface IControllerBaseService
{
IUserService UserService {get;set;}
ShoppingMode ShoppingMode {get;set;}
...
}
public abstract class ControllerBase : Controller, IControllerBaseService
{
public IUserService UserService {get;set;} // this is injected by IoC
public ShoppingMode ShoppingMode
{
get
{
return UserService.CurrentShoppingMode; // this uses injected instance to get value
}
...
}
只要我使用IoC容器创建控制器实例,就会通过容器注入UserService属性。
您现在可以从以下视图访问您的界面:
(IControllerBaseService)ViewContext.Controller
要获得IControllerBaseService
中最常用的属性的快捷方式,我有几种扩展方法,如下所示:
public static ShoppingMode CurrentShoppingMode(this HtmlHelper helper)
{
return ((IContollerBaseService)helper.ViewContext.Controller).ShoppingMode;
}
所以在视图中它看起来像@Html.CurrentShoppingMode()