MVC后台程序分几个阶段执行,例如验证,执行控制器方法等,在各个阶段我们可能需要重复使用同一信息,而我希望此信息只需获取一次,然后沿着mvc流程管道一直流动,这样在程序后面的阶段中就可以直接使用它,不用再重新获取了,以前用Session来实现,Session有很多弊端,不再叙说。
举例来说:在授权验证阶段,我们为对用户进行验证,从而获取了用户信息,当验证结束后,此用户信息并不被抛弃,而是保存下来,这样在后面的动作方法中我们就不需要再次获取用户信息,而是直接使用刚才在授权中保留下来的用户信息就可以了。
具体实现是这样的:
1首先定义前台上下文类和后台上下文类,以后台上下文为例
public class AdminWorkContext
{
public bool IsHttpAjax;//当前请求是否为ajax请求
public string IP;//用户ip
public RegionInfo Region;//区域信息
public string Url;//当前url
public string UrlReferrer;//上一次访问的url
public string Sid;//用户sid
public int Uid = -1;//用户id
public string UserName;//用户名
public string UserEmail;//用户邮箱
public string UserMobile;//用户手机号
public string NickName;//用户昵称
public string Avatar;//用户头像
public string Password;//用户密码
public PartUserInfo PartUserInfo;//用户信息
public int UserRid = -1;//用户等级id
public UserRankInfo UserRank;//用户等级信息
public string UserRTitle;//用户等级标题
public int AdminGid = -1;//用户管理员组id
public AdminGroupInfo AdminGroup;//用户管理员组信息
public string AdminGTitle;//管理员组标题
public string Controller;//控制器
public string Action;//动作方法
public string PageKey;//页面标志
}
2创建基类控制器
public class BaseController:Controller
{
///
/// 获得路由中的值
///
/// 键
/// 默认值
///
protected string GetRouteString(string key, string defaultValue)
{
object value = RouteData.Values[key];
if (value != null)
return value.ToString();
else
return defaultValue;
}
///
/// 获得路由中的值
///
/// 键
///
protected string GetRouteString(string key)
{
return GetRouteString(key, "");
}
}
3创建后台基类控制器
public class BaseAdminController:BaseController
{
//工作上下文
public AdminWorkContext WorkContext = new AdminWorkContext();
//BLL.CustomerInfoBll bll = new BLL.CustomerInfoBll();
protected override void Initialize(RequestContext requestContext)
{
//Model.CustomerInfo custModel= bll.GetById(1);
//WorkContext.UserName = custModel.cName;
在此为WorkContext类赋值
base.Initialize(requestContext);
}
4 重定义mvc视图,以便在视图中可以使用上下文类。View中使用的比如HTML/AJAX/MODEL之类的东西,因为所有的页面都继承System.Web.Mvc.WebViewPage
4.1 创建后台视图基类
///
/// PC后台视图页面基类型
///
public abstract class AdminViewPage : System.Web.Mvc.WebViewPage
{
public AdminWorkContext WorkContext;
public sealed override void InitHelpers()
{
base.InitHelpers();
Html.EnableClientValidation(true);//启用客户端验证
Html.EnableUnobtrusiveJavaScript(true);//启用非侵入式脚本
BaseAdminController baseadminController = ((this.ViewContext.Controller) as BaseAdminController);
if (baseadminController != null)
{
WorkContext = baseadminController.WorkContext;
}
}
public sealed override void Write(object value)
{
Output.Write(value);
}
}
///
/// PC后台视图页面基类型
///
public abstract class AdminViewPage : AdminViewPage
{
}
4.2 自定义视图基类
每个view文件夹下的 web.confing,修改pageBaseType为自定义的视图基类FCJShop.Web.Services.ViewPages.AdminViewPage
5 最后就可以直接 调用了
创建一个控制器继承后台基类控制器,就可以使用上下文AdminWorkContext了
网友评论