概述

1、在ASP.NET MVC项目开发的过程中,我们经常需要在cshtml的视图层输出一些公用信息 比如:页面Title、服务器日期时间、页面关键字、关键字描述、系统版本号、资源版本号等 2、普通的做法就是使用ViewBag.Title或ViewData["Title"] ,然后在视图层通过@ViewBag.Title进行输出 3、稍微高大尚一点的做法就是创建一个Model,视图层输出Model的属性,例如:@Model.Title 今天提供另外一个实践做法: ASP.NET MVC 自定义Razor视图上下文-WorkContext, 减少ViewBag、ViewData的使用

详细

一、实现背景

我们在使用ASP.NET MVC+Razor视图做WEB项目的时候大家或许都有这样的需求:

1、我们需要在每个Action中获取一些Request请求的一些公用信息

比如:

IsAjax  当前是否为Ajax请求

CurrentUserId  当前登录用户Id (从Cookie中或Session中获取)

IsSuperAdministrator 当前是否为超级管理员(拿到CurrentUserId后从DB或缓存中获取)

......

2、我们需要从后台输出一些公共信息至页面上

比如:

ResourcesVersion 资源文件版本号

ServerDateTimeString 系统日期时间(字符串类型)

SiteTitle 站点标题

......

常规做法:

接收的话我们通常会创建一个父类控制器或公共方法,来获取或设置这些信息

输出的话我们通常做法是使用 ViewBag.SiteTitle 或ViewData["SiteTitle"] 来设置与视图的模型数据,

然后在Razor视图中使用@ViewBag.SiteTitle 或@ViewData["SiteTitle"] 来显示输出

今天我们来实践另外一种比较简洁的做法(个人认为比较简洁且易扩展):通过自定义WebWorkContext来实践刚才的两点需求。创建自定义上下文和基类控制器 重写System.Web.Mvc.WebViewPage来实践。

二、程序实现

1、创建上下文类:WebWorkContext

namespace Mvc.WorkContext.WorkContexts
{
public class WebWorkContext
{
/// <summary>
/// 当前url
/// </summary>
public string Url; /// <summary>
/// 当前是否为ajax请求
/// </summary>
public bool IsHttpAjax = false; /// <summary>
/// 当前系统版本号
/// </summary>
public string Version = "1.0"; /// <summary>
/// 资源文件版本号
/// </summary>
public string ResourcesVersion = "2016.07.11.01"; /// <summary>
/// 开始执行时间
/// </summary>
public DateTime StartExecuteTime; /// <summary>
/// 页面执行时长
/// </summary>
public double ExecuteTime; /// <summary>
/// 系统日期时间(日期类型)
/// </summary>
public DateTime ServerDateTime = DateTime.Now; /// <summary>
/// 系统日期时间(字符串类型)
/// </summary>
public string ServerDateTimeString = ""; /// <summary>
/// 系统日期(字符串类型)
/// </summary>
public string ServerDateString = ""; /// <summary>
/// 站点标题
/// </summary>
public string SiteTitle = "-"; /// <summary>
/// 关键字
/// </summary>
public string SiteKeywords = ""; /// <summary>
/// 关键字描述
/// </summary>
public string SiteDescription = "";
}
}

备注:上下文类里面的属性可根据自己项目的实际情况进行删减,比如可以添加一些当前会话相关的信息:CurrentUserId、CurrentUserName等

2、创建BaseController

namespace Mvc.WorkContext.Controllers
{
public class BaseController : Controller
{
public WebWorkContext WorkContext = new WebWorkContext(); protected override void Initialize(System.Web.Routing.RequestContext requestContext)
{
base.Initialize(requestContext);
this.ValidateRequest = false;
WorkContext.Url = System.Web.HttpContext.Current.Request.Url.ToString();
if (System.Web.HttpContext.Current != null && System.Web.HttpContext.Current.Request != null)
{
WorkContext.IsHttpAjax = System.Web.HttpContext.Current.Request.Headers["X-Requested-With"] == "XMLHttpRequest";
}
WorkContext.ServerDateTime = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
WorkContext.ServerDateTimeString = WorkContext.ServerDateTime.ToString("yyyy-MM-dd HH:mm:ss");
WorkContext.ServerDateString = WorkContext.ServerDateTime.Date.ToString("yyyy-MM-dd");
} protected override void OnAuthorization(AuthorizationContext filterContext)
{
base.OnAuthorization(filterContext); if (filterContext.IsChildAction)
return; if (WorkContext.IsHttpAjax)
{ }
else
{ }
} protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
base.OnActionExecuting(filterContext);
if (filterContext.IsChildAction)
return; //页面开始执行时间
WorkContext.StartExecuteTime = DateTime.Now;
} protected override void OnActionExecuted(ActionExecutedContext filterContext)
{
base.OnActionExecuted(filterContext); //页面执行时长
WorkContext.ExecuteTime = DateTime.Now.Subtract(WorkContext.StartExecuteTime).TotalMilliseconds / 1000;
}
}
}

备注: 1、 在BaseController中全局实例WebWorkContext对象为WorkContext

2、 在BaseController里面可在Initialize方法中对WorkContext各属性进行赋值

3、自定义WebViewPage 继承自System.Web.Mvc.WebViewPage

namespace Mvc.WorkContext.WebViewPages
{
/// <summary>
/// Razor 视图所需的属性和方法。
/// </summary>
public abstract class WebViewPage<TModel> : System.Web.Mvc.WebViewPage<TModel>
{
public WebWorkContext WorkContext; public override void InitHelpers()
{
base.InitHelpers();
if (this.ViewContext.Controller is BaseController)
{
WorkContext = ((BaseController)(this.ViewContext.Controller)).WorkContext;
}
}
} /// <summary>
/// Razor 视图所需的属性和方法。
/// </summary>
public abstract class WebViewPage : WebViewPage<dynamic>
{ }
}

这里重点是重写InitHelpers方法,将BaseController中的WorkContext属性赋值给WebViewPage中定义的WorkContext属性

4、创建业务控制器HomeController 继承自:BaseController

namespace Mvc.WorkContext.Controllers
{
public class HomeController : BaseController
{
//
// GET: /Home/ public ActionResult Index()
{
WorkContext.SiteTitle = "ASP.NET MVC 自定义Razor视图上下文 -DEMO演示首页"; return View();
}
}
}

在各个业务控制器的Action中可以直接 Get/Set WorkContext中的属性

5、配置View/web.config

<system.web.webPages.razor>
<host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
<!--
替换原有的pageBaseType为自定义的WebViewPage
<pages pageBaseType="System.Web.Mvc.WebViewPage">
-->
<pages pageBaseType="Mvc.WorkContext.WebViewPages.WebViewPage">
<namespaces>
<add namespace="System.Web.Mvc" />
<add namespace="System.Web.Mvc.Ajax" />
<add namespace="System.Web.Mvc.Html" />
<add namespace="System.Web.Routing" />
</namespaces>
</pages>
</system.web.webPages.razor>

配置Views/web.config 中的system.web.webPages.razor->pageBaseType的配置

示例截图:

6、在cshtml视图中使用WebWorkContext对象中的属性

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>@WorkContext.SiteTitle</title>
<meta name="keywords" content="@WorkContext.SiteKeywords" />
<meta name="description" content="@WorkContext.SiteDescription" />
<link href="/Content/css/css.css?r=@WorkContext.ResourcesVersion" rel="stylesheet"/>
</head>
<body>
<h1>
<a href="/List/Index">GOTO List</a>
</h1>
<table width="100%" border="0">
<caption>@WorkContext.SiteTitle</caption>
<tr>
<td>序号</td>
<td>属性</td>
<td>值</td>
</tr>
<tr>
<td>1</td>
<td>Url</td>
<td>@WorkContext.Url</td>
</tr>
<tr>
<td>2</td>
<td>IsHttpAjax</td>
<td>@WorkContext.IsHttpAjax</td>
</tr>
<tr>
<td>3</td>
<td>Version</td>
<td>@WorkContext.Version</td>
</tr>
<tr>
<td>4</td>
<td>ResourcesVersion</td>
<td>@WorkContext.ResourcesVersion</td>
</tr>
<tr>
<td>5</td>
<td>StartExecuteTime</td>
<td>@WorkContext.StartExecuteTime</td>
</tr>
<tr>
<td>6</td>
<td>ExecuteTime</td>
<td>@WorkContext.ExecuteTime</td>
</tr>
<tr>
<td>7</td>
<td>ServerDateTime</td>
<td>@WorkContext.ServerDateTime</td>
</tr>
<tr>
<td>8</td>
<td>ServerDateTimeString</td>
<td>@WorkContext.ServerDateTimeString</td>
</tr>
<tr>
<td>9</td>
<td>ServerDateString</td>
<td>@WorkContext.ServerDateString</td>
</tr>
<tr>
<td>10</td>
<td>SiteTitle</td>
<td>@WorkContext.SiteTitle</td>
</tr>
<tr>
<td>11</td>
<td>SiteKeywords</td>
<td>@WorkContext.SiteKeywords</td>
</tr>
<tr>
<td>12</td>
<td>SiteDescription</td>
<td>@WorkContext.SiteDescription</td>
</tr>
</table> </body>
</html>

7、项目结构

三、样式效果

四、代码截图

注:本文著作权归作者,由demo大师发表,拒绝转载,转载需要作者授权

ASP.NET MVC 自定义Razor视图WorkContext的更多相关文章

  1. ASP.NET MVC 3 Razor 视图引擎 基本语法

    本篇博文将进入MVC 3 的世界了,首先学习一下MVC 3 新增的Razor视图引擎的基本语法. 1. 使用 @ 字符将代码添加到页面中.正如传统的aspx视图的<% %>相同.      ...

  2. Asp.Net MVC 5 Razor 视图 未将对象引用到实例

    未将对象引用到实例的错误居然指向了@{Leyout=“..此处略,核实路径无误”}. 最后发现原来是在一个<select .. name="@Model.Category"& ...

  3. ASP.NET MVC (Razor)开发

    ASP.NET MVC (Razor)开发 过去我们使用过一些周报工具来完成项目组或部门的周报填写与考核工作,但多少有些不理想,要么功能太过简单,要么功能特别繁杂,不接地气,使用不便. 后来我们就考虑 ...

  4. asp.net mvc 自定义pager封装与优化

    asp.net mvc 自定义pager封装与优化 Intro 之前做了一个通用的分页组件,但是有些不足,从翻页事件和分页样式都融合在后台代码中,到翻页事件可以自定义,再到翻页和样式都和代码分离, 自 ...

  5. ASP.NET MVC 3: Razor中的@:和语法

    原文 ASP.NET MVC 3: Razor中的@:和语法 [原文发表地址] ASP.NET MVC 3: Razor’s @: and <text> syntax[原文发表时间] De ...

  6. ASP.NET MVC:Razor 引入命名空间

    原文:ASP.NET MVC:Razor 引入命名空间 页面中引用 c# @using MvcApplication83.Models @using MvcApplication83.Common 行 ...

  7. ASP.NET MVC自定义验证Authorize Attribute(包含cookie helper)

    前几天Insus.NET有在数据库实现过对某一字段进行加密码与解密<使用EncryptByPassPhrase和DecryptByPassPhrase对MS SQLServer某一字段时行加密和 ...

  8. ASP.NET MVC学习之视图篇(2)

    继ASP.NET MVC学习之视图(1)学习 4.HTML辅助器 虽然在ASP.NET MVC中我们已经摆脱了ASP.NET的控件,但是对于页面中需要循环标签的情况依然还是存在,可能很多人认为用for ...

  9. ASP.NET MVC 自定义路由中几个需要注意的小细节

    本文主要记录在ASP.NET MVC自定义路由时,一个需要注意的参数设置小细节. 举例来说,就是在访问 http://localhost/Home/About/arg1/arg2/arg3 这样的自定 ...

随机推荐

  1. Python 实现简单的感知机算法

    感知机 随机生成一些点和一条原始直线,然后用感知机算法来生成一条直线进行分类,比较差别 导入包并设定画图尺寸 import numpy as np import matplotlib.pyplot a ...

  2. activemq 消息传送测试

    activemq 5.10.0,topic   messagelength字符 20000011     发送时间 接收时间 传送时间 毫秒 1 1443067284128 1443067288325 ...

  3. HTML5项目笔记4:使用Audio API设计绚丽的HTML5音乐播放器

    HTML5 有两个很炫的元素,就是Audio和 Video,可以用他们在页面上创建音频播放器和视频播放器,制作一些效果很不错的应用. 无论是视屏还是音频,都是一个容器文件,包含了一些音频轨道,视频轨道 ...

  4. DOM节点中属性nodeName、nodeType和nodeValue的区别 < Delphi >

    http://msdn.microsoft.com/zh-cn/library/vstudio/hf9hbf87.aspx <?xml version="1.0"?> ...

  5. OSChina.net 的 Tomcat 配置 server.xml 参考

    这是目前 oschina.net 正在使用的 tomcat 的 server.xml 的配置文件内容 <Server port="9005" shutdown="S ...

  6. asp.net core更进内容

    ASP.NET Core 是对 ASP.NET 的一次意义重大的重构.本文介绍了 ASP.NET Core 中的一些新概念,并且解释了它们如何帮助你开发现代的 Web 应用程序. 章节: 什么是 AS ...

  7. Android开发之MdiaPlayer详解

    Android开发之MdiaPlayer详解 MediaPlayer类可用于控制音频/视频文件或流的播放,我曾在<Android开发之基于Service的音乐播放器>一文中介绍过它的使用. ...

  8. 《Hadoop应用开发技术详解》

    <Hadoop应用开发技术详解> 基本信息 作者: 刘刚 丛书名: 大数据技术丛书 出版社:机械工业出版社 ISBN:9787111452447 上架时间:2014-1-10 出版日期:2 ...

  9. Linux进程间通信—共享内存

    五.共享内存(shared memory) 共享内存映射为一段可以被其他进程访问的内存.该共享内存由一个进程所创建,然后其他进程可以挂载到该共享内存中.共享内存是最快的IPC机制,但由于linux本身 ...

  10. Flume的安装配置

    flume是一个分布式.可靠.和高可用的海量日志采集.聚合和传输的系统.支持在日志系统中定制各类数据发送方,用于收集数据;同时,Flume提供对数据进行简单处理,并写到各种数据接受方(比如文本.HDF ...