ASP.NET MVC知识点

HttpContext, HttpContextBase, HttpContextWrapper联系

HttpContext

HttpContext是最原始的ASP.NET Context. MVC的目的之一是能够单元测试。HttpContext没有base class,并且不是virtual,所以不能用单元测试,因为没有办法mock.

HttpContextBase

HttpContextBase, 是用来在MVC中替代HttpContext.但是这是一个abstract类,是mockable的。

HttpContextWrapper

HttpContextWrapperHttpContextBase的实现类,用来真正的替换HttpContext,可以用new HttpContextWrapper(HttpContext.Current)的方式来创建一个ttpContextWrapper.观察代码可以发现,HttpContextHttpContextWrapper在属性方法设置上基本上是一样的,只是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“为KEYCOOKIE给控制层。

2、[ValidateAntiForgeryToken],根据传过来的令牌进行对比,如果相同,则允许访问,如果不同则拒绝访问。

关键:ValidateAntiForgeryToken只针对POST请求。

换句话说,[ValidateAntiForgeryToken]必须和[HttpPost]同时加在一个ACTION上才可以正常使用。


MVC控件

ASP .NET MVC框架中没有了自己的控件,页面显示完全就回到了写html代码的年代。还好在 asp .net mvc框架中也有自带的HtmlHelperUrlHelper两个帮助类。另外在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类:该类主要用于生成相关链接,主要扩展了ActionLinkRouteLink方法。

ActionLink:扩展方法主要实现一个连接,共有十个重载方法。

UrlHelper帮助类

看类名也都知道这个类是用来成URLASP .NET MVC应用程序中。
UrlHelper提供了四个非常常用的四个方法。

1.Action方法通过提供Controller,Action和各种参数生成一个URL
2.Content方法是将一个虚拟的,相对的路径转换到应用程序的绝对路径,
3.Encode方法是对URL地址进行加密,与Server.Encode方法一样。
4.RouteUrl方法是提供在当前应用程序中规定的路由规则中匹配出URL。

另外还有两个属性,分别是RequestContextRouteCollection两个属性,分别指的是包含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控件。如一些控件套包,表格控件等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值