美文网首页
MVC上下文设计

MVC上下文设计

作者: 凌雲木 | 来源:发表于2017-07-04 11:17 被阅读38次

    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了

    相关文章

      网友评论

          本文标题:MVC上下文设计

          本文链接:https://www.haomeiwen.com/subject/rpithxtx.html