[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[] ...
随机推荐
- 【原创】NIO框架入门(四):Android与MINA2、Netty4的跨平台UDP双向通信实战
概述 本文演示的是一个Android客户端程序,通过UDP协议与两个典型的NIO框架服务端,实现跨平台双向通信的完整Demo. 当前由于NIO框架的流行,使得开发大并发.高性能的互联网服务端成为可能. ...
- Open Cascade DataExchange IGES
Open Cascade DataExchange IGES eryar@163.com 摘要Abstract:本文结合OpenCascade和Initial Graphics Exchange Sp ...
- 【转】“正由另一进程使用,因此该进程无法访问该文件”的问题&解决方法
正在写一个手指画图的程序C# + WPF其中有一部分是加载外部某PNG文件,放入BitmapImage,再作为Image的Source显示在Canvas上画了几笔之后,再存回这个PNG文件 ===== ...
- NSIS安装与向导生成代码
NSIS 的脚本语言和通常的编程语言有类似的结构和语法,但它是为安装程序这类应用所设计的.NSIS (Nullsoft Scriptable Install System) 是一个专业开源的制作 wi ...
- Docker - Docker基础命令及使用
Docker Docker - 官网 Docker - Hub GitHub - Docker Docker中文社区 Docker基础命令 Docker 查看帮助信息:docker --help 查看 ...
- Concise - 面向对象的,一致的前端开发框架
在当今世界,有许多前端开发的框架.那么,为什么还要再造一个框架呢?Concise 建立的目的是使你有很多的开箱即用的选项,让你能够方便的搭建移动友好的网站和 Web 应用程序.另外还包括一个简单的网格 ...
- C#序列化s实体类成Xml,去除空格、换行符以及命名空间
序列化实体类成为一个干净的Xml,不带空格.换行符以及命名空间 /// <summary> /// 序列化成XML /// </summary> /// <typepar ...
- 递归查询树形结构的SQL
最近项目中要递归树形,案例如下: 测试数据: ),PID ),Name )) ',NULL ,'山东省' ','烟台市' ','招远市' ','青岛市' ',NULL ,'四会市' ','清远市' ' ...
- 基于C#的MongoDB数据库开发应用(2)--MongoDB数据库的C#开发
在上篇博客<基于C#的MongoDB数据库开发应用(1)--MongoDB数据库的基础知识和使用>里面,我总结了MongoDB数据库的一些基础信息,并在最后面部分简单介绍了数据库C#驱动的 ...
- 【SQL】CLR聚合函数什么鬼
之前写过一个合并字符串的CLR聚合函数,基本是照抄MS的示例,外加了一些处理,已经投入使用很长时间,没什么问题也就没怎么研究,近日想改造一下,遇到一些问题,遂捣鼓一番,有些心得,记录如下. 一.杂项 ...