[asp.net mvc 奇淫巧技] 01 - 封装上下文 - 在View中获取自定义的上下文
我们在asp.net 开发中已经封装了最强大的HttpContext,我们可以在HttpContext中可以获取到几乎任何想获取的东西,也可以在HttpContext写入需要返回客户端的信息。但是这些还远远不能满足一些要求,比如在任何地方可以获取到登录用户的信息等等。
之前获取登录用户的信息基本上都是哪里用到就从session里获取,这样做的缺点很多就不一一说明了。
现在我们通过封装一个WebWorkContext就可以随用随取,不用再次从session、数据库或者缓存中获取了。
1、首先新建类WebWorkContext
为了演示方便就不建立多个项目了,WebWorkContext就直接建在Mvc的Model中了。
public class WebWorkContext
{ /// <summary>
/// 判断用户是否登录
/// </summary>
public bool IsLogin { get; set; } /// <summary>
/// 用户ID
/// </summary>
public int UserId { get; set; } /// <summary>
/// 用户名称
/// </summary>
public string UserName { get; set; } /// <summary>
/// 用户邮箱
/// </summary>
public string UserEmail { get; set; } /// <summary>
/// 是否是Get请求
/// </summary>
public bool IsGet { get; set; } /// <summary>
/// 是否是Ajax请求
/// </summary>
public bool IsAjax { get; set; } }
2、在Controller中新建类BaseController,并继承Controller
刚刚提出刚才的需求就会有很多人想到用继承了,确实是用继承,不过后面也许会有你想不到的好处。
public class BaseController : Controller
{
/// <summary>
/// 创建上下文Context
/// </summary>
protected WebWorkContext WorkContext = new WebWorkContext(); /// <summary>
/// 重写Controller中的Initialize方法。在此方法中获取用户和其他的信息
/// </summary>
/// <param name="requestContext"></param>
protected override void Initialize(RequestContext requestContext)
{
base.Initialize(requestContext); // 判断用户信息
if (!string.IsNullOrEmpty(Convert.ToString(Session["USERID"])))
{
WorkContext.IsLogin = true;
WorkContext.UserId = Convert.ToInt32(Session["USERID"]);
WorkContext.UserName = Convert.ToString(Session["USERNAME"]);
WorkContext.UserEmail = Convert.ToString(Session["USEREMAIL"]);
} // 判断是否是Get请求
WorkContext.IsGet = requestContext.HttpContext.Request.HttpMethod == "GET"; // 判断是否是Ajax请求
WorkContext.IsAjax = requestContext.HttpContext.Request.IsAjaxRequest(); } }
3.1、在Controller中使用WebWorkContext
我们刚才所做的所有代码都是为了方便使用一些封装的信息,在Controller中使用WebWorkContext是最简单的一种使用方式,只要Controller继承新建的BaseController就可使用WebWorkContext中的任何东西。
public class HomeController : BaseController
{
public ActionResult Index()
{
var userId = WorkContext.UserId;
var userName = WorkContext.UserName;
return View();
}
}
}
3.2、在View(cshtml)中使用WebWorkContext
重点来了,之前的几步对于有一点工作经验的都可以很简单的完成,但是在View中使用自定义的类有很多童鞋还是不明白其中的道理。
第一首先要明白我们可以在View中使用比如Html/Ajax/Model之类的东西,是因为我们的页面都继承了一个类WebViewPage。
明白这个道理以后就很简单了,我们只要让我们的View继承我们自定义的一个类,然后让我们自定义的类继承WebViewPage即可,然后我们就可以在我们自定义的类中做你想做的任何事了。
还要明白一个很重要的知识点,就是在哪更改View继承类,当然微软已经为我们扩展做好了,在每个Views文件夹下都有个web.config,找到pageBaseType,更改值为我们自定义类的即可。
3.2.1、新建自定义WebViewPage类(WebWorkContextWebViewPage)
public abstract class WebWorkContextWebViewPage<TModel> : System.Web.Mvc.WebViewPage<TModel>
{
public WebWorkContext WorkContext;
public sealed override void InitHelpers()
{
base.InitHelpers();
BaseController baseController = ((this.ViewContext.Controller) as BaseController);
if (baseController != null)
{
WorkContext = baseController.WorkContext;
} }
}
3.2.2、更改View的继承,在Views文件夹中的web.config中找到pageBaseType,值更改为我们自定义的类就行了。
<system.web.webPages.razor>
<host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
<pages pageBaseType="WebWorkContextDemo.WebWorkContextWebViewPage">
</pages>
</system.web.webPages.razor>
3.2.3、最后一步就是使用了,这个更简单了直接调用即可。
这里需要注意的是,我们观察代码就知道,View中的WebWorkContext其实是获取BaseController中的,所以使用WebWorkContext的View所对应的Controller必须继承BaseController。
@{
ViewBag.Title = "Home Page";
}
用户的邮箱是: @WorkContext.UserEmail<br />
用户名是: @WorkContext.UserName<br />
@{
var id = WorkContext.UserId;
}
4、【扩展】,在BLL和DAL中使用WebWorkContext
在Asp.net MVC中使用WebWorkContext已经结束了,但是有很多的时候在需要在其他的层也需要把一些重要的信息沉淀下去,当然最简单的就是每次调用方法把需要的值通过方法参数传递至BLL和DAL。当然这样不是最优的解决方案,如果一个类中的很多方法都需要一个参数,我们肯定不会每次都通过方法传递的,我们会通过设置属性,或者通过一个方法设置值,然后在调用我们需要的方法。
这样说就简单了,我们可以在Action每次调用BLL方法之前先设置我们的WebWorkContext就可以了。
public class HomeController : BaseController
{ UserBLL bll = new UserBLL(); /// <summary>
/// 重写Initialize,给BLL设置WebWorkContext
/// </summary>
/// <param name="requestContext"></param>
protected override void Initialize(RequestContext requestContext)
{
base.Initialize(requestContext);
bll.WorkContext = WorkContext;
}
}
这样我们就可以在BLL中任意的使用WebWorkContext了。
同样的道理也可以设置DAL中的WebWorkContext。
BLL:
public class UserBLL : BaseBLL
{
UserDAL dal = new UserDAL(); public override WebWorkContext WorkContext
{
get
{
return base.WorkContext;
} set
{
base.WorkContext = value;
dal.WorkContext = value;
}
} public string GetBLLUserAge()
{
return WorkContext.UserId.ToString();
}
}
DAL:
public class UserDAL : BaseDAL
{
public string GetUserAge()
{
return WorkContext.UserId.ToString();
}
}
在BaseBLL和BaseDAL中都只有一段代码,设置可以重写的WebWorkContext。
public virtual WebWorkContext WorkContext { get; set; }
总结:这样我们就可以几乎在整个解决方案中使用WebWorkContext了,这样每次使用的时候直接用就可以,不需要再次判断获取。
源码Github:https://github.com/Emrys5/Asp.MVC-01-WebWorkContext
系列课程
- [asp.net mvc 奇淫巧技] 01 - 封装上下文 - 在View中获取自定义的上下文
- [asp.net mvc 奇淫巧技] 02 - 巧用Razor引擎在Action内生成Html代码
- [asp.net mvc 奇淫巧技] 03 - 枚举特性扩展解决枚举命名问题和支持HtmlHelper
- [asp.net mvc 奇淫巧技] 04 - 你真的会用Action的模型绑定吗?
- [asp.net mvc 奇淫巧技] 05 - 扩展ScriptBundle,支持混淆加密javascript
- [asp.net mvc 奇淫巧技] 06 - 也许你的项目同一个用户的请求都是同步的
[asp.net mvc 奇淫巧技] 01 - 封装上下文 - 在View中获取自定义的上下文的更多相关文章
- [asp.net mvc 奇淫巧技] 02 - 巧用Razor引擎在Action内生成Html代码
在web开发中经常会遇到在内部代码中获取Html,这些Html是需要和数据进行一起渲染.并不是直接把Html代码返回给客户端.这样的做法有很多应用场景,例如分页.Ajax一次性获取几段Html片段.生 ...
- [asp.net mvc 奇淫巧技] 03 - 枚举特性扩展解决枚举命名问题和支持HtmlHelper
一.需求 我们在开发中经常会遇到一些枚举,而且这些枚举类型可能会在表单中的下拉中,或者单选按钮中会用到等. 这样用是没问题的,但是用过的人都知道一个问题,就是枚举的命名问题,当然有很多人枚举直接中文命 ...
- [asp.net mvc 奇淫巧技] 04 - 你真的会用Action的模型绑定吗?
在QQ群或者一些程序的交流平台,经常会有人问:我怎么传一个数组在Action中接收.我传的数组为什么Action的model中接收不到.或者我在ajax的data中设置了一些数组,为什么后台还是接收不 ...
- [asp.net mvc 奇淫巧技] 05 - 扩展ScriptBundle,支持混淆加密javascript
一.需求: 在web开发中,经常会处理javascript的一些问题,其中就包括js的压缩,合并,发布版本以及混淆加密等等问题.在asp.net 开发中我们使用ScriptBundle已经可以解决ja ...
- [asp.net mvc 奇淫巧技] 06 - 也许你的项目同一个用户的请求都是同步的
一.感慨 很久前看到一篇博客中有句话大致的意思是:“asp.net 程序性能低下的主要原因是开发人员技术参差不齐”,当时看到这句话不以为然,然而时间过的越久接触的.net 开发人员越多就越认同这句话: ...
- ASP.NET Core 奇淫技巧之伪属性注入
一.前言 开局先唠嗑一下,许久未曾更新博客,一直在调整自己的状态,去年是我的本命年,或许是应验了本命年的多灾多难,过得十分不顺,不论是生活上还是工作上.还好当我度过了所谓的本命年后,许多事情都在慢慢变 ...
- [javascript 实践篇]——那些你不知道的“奇淫巧技”
1. 空(null, undefined)验证 刚开始,我是比较蠢的验证(我还真是这样子验证的) if (variable1 !== null || variable1 !== undefined | ...
- asp.net mvc 如何在View中获取Url参数的值
如果url是 /home/index?id=3 直接Request就ok. 但是如果路由设定为:{controller}/{action}/{id} url是 /home/index/3 这时想在 ...
- C# -- 等待异步操作执行完成的方式 C# -- 使用委托 delegate 执行异步操作 JavaScript -- 原型:prototype的使用 DBHelper类连接数据库 MVC View中获取action、controller、area名称、参数
C# -- 等待异步操作执行完成的方式 C# -- 等待异步操作执行完成的方式 1. 等待异步操作的完成,代码实现: class Program { static void Main(string[] ...
随机推荐
- winform 程序制作自己的数字签名(续)
在上一篇文章<winform 程序制作自己的数字签名>中我们已经可以得到我们程序定制的数字签名了,但是比较讨厌的是每次编译之后,数字签名需要重新手动添加. 我们需要的是在程序编译时自动添加 ...
- css 用direction来改变元素水平方向,价值研究。
"direction"有两个值:ltr | rtl ltr:从左往右 rtl:从右往左 默认:ltr 一起看个效果就懂了. <style> div{ direction ...
- WPF Bitmap转Imagesource
var imgsource = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(bmp.GetHbitmap(),IntPtr ...
- JQuery Datatables服务器端处理示例
HTML <table class="table table-striped table-bordered table-hover" id="table_repor ...
- Zookeeper-Zookeeper的配置
前面两篇文章介绍了Zookeeper是什么和可以干什么,那么接下来我们就实际的接触一下Zookeeper这个东西,看看具体如何使用,有个大体的感受,后面再描述某些地方的时候也能在大脑中有具体的印象.本 ...
- mysql load data infile的使用 和 SELECT into outfile备份数据库数据
LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE 'file_name.txt' [REPLACE | IGNORE] INTO TABLE t ...
- 如何在windows 10 x64安装佳能 CP900 驱动
佳能太无耻,为了销售CP910 , CP900 到win8 ,win8.1,win 10 都没有驱动程序,网上找的方法都不行,IT民工自有办法: 1.按住shift键,重启电脑 restart 2.在 ...
- Testing - 测试基础 - 流程
测试存在于各个阶段: 需求测试--->单元测试--->集成测试--->系统测试--->性能测试--->用户测试--->回归测试 需求测试 完整性&正确性 一 ...
- Nodejs学习笔记(二)——Eclipse中运行调试Nodejs
前篇<Nodejs学习笔记(一)——初识Nodejs>主要介绍了在搭建node环境过程中遇到的小问题以及搭建Eclipse开发Node环境的前提步骤.本篇主要介绍如何在Eclipse中运行 ...
- 在Mysql中Using filesort代表什么意思?
在Mysql中使用explain来查看sql执行信息时,经常会看到Using filesort.那么Using filesort在MySQL中代表什么意思呢? 有人会说是外部排序,其实是不对或者不准确 ...