HttpContext, HttpContextBase, HttpContextWrapper联系
HttpContext
HttpContext
是最原始的ASP.NET Context
. MVC的目的之一是能够单元测试。HttpContext
没有base class
,并且不是virtual
,所以不能用单元测试,因为没有办法mock
.
HttpContextBase
HttpContextBase
, 是用来在MVC
中替代HttpContext
.但是这是一个abstract
类,是mockable
的。
HttpContextWrapper
HttpContextWrapper
是HttpContextBase
的实现类,用来真正的替换HttpContext
,可以用new HttpContextWrapper(HttpContext.Current)
的方式来创建一个ttpContextWrapper
.观察代码可以发现,HttpContext
与HttpContextWrapper
在属性方法设置上基本上是一样的,只是HttpContextWrapper
不是virtual
,有base class
,因此可以进行单元测试。现在,关于使用到HttpContext
的方法,可以通过HttpContextWrapper
来进行单元测试。观察ASP.NET MVC
的源码可以发现,在最终MVCHandler
(ASP.NET MVC的HttpHandler
)中,调用ProcessRequest(HttpContext context)
方法的时候,其内部把HttpContext
转为HttpContextWrapper
,然后调用了ProcessRequest(HttpContext context)
来进行后续的处理。
public ProcessRequest(HttpContext context)
{
HttpContextWrapper _context = new HttpContextWrapper(context);
ProcessRequest(_context);
}
public ProcessRequest(HttpContextBase context)
{
//进行相应的Controller,Action的调用
}
ValidateAntiForgeryToken 防止CSRF(跨网站请求伪造)
用途:防止
CSRF
(跨网站请求伪造)。用法:在
View->Form
表单中:<%:Html.AntiForgeryToken()%>
在
Controller->Action
动作上:[ValidateAntiForgeryToken]
原理:
1、<%:Html.AntiForgeryToken()%>
这个方法会生成一个隐藏域:<inputname="__RequestVerificationToken" type="hidden" value="7FTM...sdLr1" />
并且会将一个以”__RequestVerificationToken
“为KEY
的COOKIE
给控制层。
2、[ValidateAntiForgeryToken]
,根据传过来的令牌进行对比,如果相同,则允许访问,如果不同则拒绝访问。
关键:ValidateAntiForgeryToken
只针对POST
请求。
换句话说,[ValidateAntiForgeryToken]
必须和[HttpPost]
同时加在一个ACTION
上才可以正常使用。
MVC控件
在ASP .NET MVC
框架中没有了自己的控件,页面显示完全就回到了写html代码的年代。还好在 asp .net mvc
框架中也有自带的HtmlHelper
和UrlHelper
两个帮助类。另外在MvcContrib
扩展项目中也有扩展一些帮助类,这样我们就不光只能使用完整的html来编写了需要显示的页面了,就可以使用这些帮助类来完成,但最后运行时都还是要生成html代码的。
HtmlHelper类
HtmlHelper
类位于System.Web.MVC.Html
命名空间下。主要包括FormExtensions
,InputExtensions
,LinkExtensions,SelectExtensions,TextAreaExtensions,ValidationExtensions,RenderPartialExtensions
等7个静态类,他们全部是是采用拓展方法来实现的。
InputExtensions
类:主要有5种类型的扩展方法,分别用于CheckBox
控件、Hidden
控件、Pass
控件、RadionButton
控件和TextBox
控件
LinkExtensions
类:该类主要用于生成相关链接,主要扩展了ActionLink
和RouteLink
方法。
ActionLink
:扩展方法主要实现一个连接,共有十个重载方法。
UrlHelper帮助类
看类名也都知道这个类是用来成URL
在 ASP .NET MVC
应用程序中。
UrlHelper
提供了四个非常常用的四个方法。
1.
Action
方法通过提供Controller
,Action
和各种参数生成一个URL
,
2.Content
方法是将一个虚拟的,相对的路径转换到应用程序的绝对路径,
3.Encode
方法是对URL
地址进行加密,与Server.Encode
方法一样。
4.RouteUrl
方法是提供在当前应用程序中规定的路由规则中匹配出URL。
另外还有两个属性,分别是RequestContext
和RouteCollection
两个属性,分别指的是包含HTTP
上下文和RouteData
两个属性,另外,RouteCollection
是整个当前应用程序中规定的路由规则。
自定义控件
微软提供的HtmlHelper
已经是足够大部分开发人员使用了,但是有一些功能要用微软提供的HtmlHelper
可能还不满足要求。接下来就谈谈如何自定义的过程。
首先自定义的方法就是对HtmlHelper
对象的扩展。
扩展方法实现的三要素:1、静态类 2、静态方法 3、this关键字
1、先定义一个类,例如:MyHtmlHelper:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace MvcApplicationFirstDome.Models {
//静态类
public static class MyHtmlHelper
{
//静态方法
}
}
2、假设要扩展的方式是GetSpan
,作用就是当你传入参数时,内部封装了之后返回结果,代码如下。注意在MyHtmlHelper
类中要引用using System.Web.Mvc
命名空间。
//静态方法
public static string GetSpan(this HtmlHelper htmlHelper,string text)
{
return "<span style='color:Red'>"+text+"</span>";
}
经过上面两步之后HtmlHelper
的扩展方法GetSpan
基本可以使用了,接下来就讲解如何在页面调用了。
在调用的时候要注意下一命名空间:如果扩展方法的命名空间和页面的命名空间不同的就必须引用扩展方法的命名空间,否则在页面是没有办法调用自定义的方法的。
引用完命名空间之后,就可以在相应的页面调用自定义的扩展方法了。
对于某些项目来说,自定义控件过于复杂和浪费时间。这个时候也可以从技术社区或是源代码站下载适合自己需求的Mvc控件。如一些控件套包,表格控件等。