MVC上下文设计

2017-07-04  本文已影响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了

上一篇 下一篇

猜你喜欢

热点阅读