于ASP.NET MVC Preview5.

前一篇中我们已经了解了Action Filter 与 内置的Filter实现,现在我们就来写一个实例。就写一个防盗链的Filter吧。

首先继承自FilterAttribute类同时实现IActionFilter接口,代码如下:



ASP.NET MVC 入门10、Action Filter 与 内置的Filter实现(实例-防盗链)_mvc

ASP.NET MVC 入门10、Action Filter 与 内置的Filter实现(实例-防盗链)_asp.net_02/// <summary>

ASP.NET MVC 入门10、Action Filter 与 内置的Filter实现(实例-防盗链)_文件类型_03/// 防盗链Filter.

ASP.NET MVC 入门10、Action Filter 与 内置的Filter实现(实例-防盗链)_asp.net_04/// </summary>

ASP.NET MVC 入门10、Action Filter 与 内置的Filter实现(实例-防盗链)_缓存_05public class AntiOutSiteLinkAttribute : ActionFilterAttribute, IActionFilter

ASP.NET MVC 入门10、Action Filter 与 内置的Filter实现(实例-防盗链)_asp.net_02{

ASP.NET MVC 入门10、Action Filter 与 内置的Filter实现(实例-防盗链)_文件类型_03    public AntiOutSiteLinkAttribute(FileType fileType)

ASP.NET MVC 入门10、Action Filter 与 内置的Filter实现(实例-防盗链)_filter_08    {

ASP.NET MVC 入门10、Action Filter 与 内置的Filter实现(实例-防盗链)_文件类型_03        this.FileType = fileType;

ASP.NET MVC 入门10、Action Filter 与 内置的Filter实现(实例-防盗链)_mvc_10    }

ASP.NET MVC 入门10、Action Filter 与 内置的Filter实现(实例-防盗链)_文件类型_03

ASP.NET MVC 入门10、Action Filter 与 内置的Filter实现(实例-防盗链)_filter_08    /// <summary>

ASP.NET MVC 入门10、Action Filter 与 内置的Filter实现(实例-防盗链)_文件类型_03    /// 请求的文件类型.(文件或图片)

ASP.NET MVC 入门10、Action Filter 与 内置的Filter实现(实例-防盗链)_mvc_10    /// </summary>

ASP.NET MVC 入门10、Action Filter 与 内置的Filter实现(实例-防盗链)_filter_08    public FileType FileType { get; set; }

ASP.NET MVC 入门10、Action Filter 与 内置的Filter实现(实例-防盗链)_文件类型_03

ASP.NET MVC 入门10、Action Filter 与 内置的Filter实现(实例-防盗链)_filter_17    IActionFilter 成员

ASP.NET MVC 入门10、Action Filter 与 内置的Filter实现(实例-防盗链)_文件类型_03

ASP.NET MVC 入门10、Action Filter 与 内置的Filter实现(实例-防盗链)_filter_08    /// <summary>

ASP.NET MVC 入门10、Action Filter 与 内置的Filter实现(实例-防盗链)_文件类型_03    /// 获取网站的根域名

ASP.NET MVC 入门10、Action Filter 与 内置的Filter实现(实例-防盗链)_文件类型_03    /// </summary>

ASP.NET MVC 入门10、Action Filter 与 内置的Filter实现(实例-防盗链)_文件类型_03    /// <param name="domain">网站的域名,不带"Http://"</param>

ASP.NET MVC 入门10、Action Filter 与 内置的Filter实现(实例-防盗链)_mvc_10    /// <returns></returns>

ASP.NET MVC 入门10、Action Filter 与 内置的Filter实现(实例-防盗链)_文件类型_03    private string GetRootDomain(string domain)

ASP.NET MVC 入门10、Action Filter 与 内置的Filter实现(实例-防盗链)_filter_08    {

ASP.NET MVC 入门10、Action Filter 与 内置的Filter实现(实例-防盗链)_文件类型_03        if (string.IsNullOrEmpty(domain))

ASP.NET MVC 入门10、Action Filter 与 内置的Filter实现(实例-防盗链)_filter_08        {

ASP.NET MVC 入门10、Action Filter 与 内置的Filter实现(实例-防盗链)_文件类型_03            throw new ArgumentNullException("参数'domain'不能为空");

ASP.NET MVC 入门10、Action Filter 与 内置的Filter实现(实例-防盗链)_mvc_10        }

ASP.NET MVC 入门10、Action Filter 与 内置的Filter实现(实例-防盗链)_filter_08        string[] arr = domain.Split(new[] { '.' }, StringSplitOptions.RemoveEmptyEntries);

ASP.NET MVC 入门10、Action Filter 与 内置的Filter实现(实例-防盗链)_文件类型_03        if (arr.Length <= 2)

ASP.NET MVC 入门10、Action Filter 与 内置的Filter实现(实例-防盗链)_filter_08        {

ASP.NET MVC 入门10、Action Filter 与 内置的Filter实现(实例-防盗链)_文件类型_03            return domain;

ASP.NET MVC 入门10、Action Filter 与 内置的Filter实现(实例-防盗链)_mvc_10        }

ASP.NET MVC 入门10、Action Filter 与 内置的Filter实现(实例-防盗链)_文件类型_03        else

ASP.NET MVC 入门10、Action Filter 与 内置的Filter实现(实例-防盗链)_filter_08        {

ASP.NET MVC 入门10、Action Filter 与 内置的Filter实现(实例-防盗链)_文件类型_03            return arr[arr.Length - 2] + "." + arr[arr.Length - 1];

ASP.NET MVC 入门10、Action Filter 与 内置的Filter实现(实例-防盗链)_mvc_10        }

ASP.NET MVC 入门10、Action Filter 与 内置的Filter实现(实例-防盗链)_mvc_10    }

ASP.NET MVC 入门10、Action Filter 与 内置的Filter实现(实例-防盗链)_asp.net_04}

ASP.NET MVC 入门10、Action Filter 与 内置的Filter实现(实例-防盗链)_缓存_05

ASP.NET MVC 入门10、Action Filter 与 内置的Filter实现(实例-防盗链)_缓存_05public enum FileType

ASP.NET MVC 入门10、Action Filter 与 内置的Filter实现(实例-防盗链)_asp.net_02{

ASP.NET MVC 入门10、Action Filter 与 内置的Filter实现(实例-防盗链)_文件类型_03    File = 1,

ASP.NET MVC 入门10、Action Filter 与 内置的Filter实现(实例-防盗链)_文件类型_03    Image

ASP.NET MVC 入门10、Action Filter 与 内置的Filter实现(实例-防盗链)_asp.net_04}

ASP.NET MVC 入门10、Action Filter 与 内置的Filter实现(实例-防盗链)_mvc


 

然后我们建立一个用于处理文件请求的Controller,并应用上我们刚才建立的Filter:



ASP.NET MVC 入门10、Action Filter 与 内置的Filter实现(实例-防盗链)_mvc

public class FilesController : BaseController

{

    [AntiOutSiteLink(FileType.Image)]

    public ActionResult Image(string file)

    {

        return Content("Image From 4mvc");

    } 


    [AntiOutSiteLink(FileType.File)]

    public ActionResult File(string file)

    {

        return Content("File From 4mvc");

    }

ASP.NET MVC 入门10、Action Filter 与 内置的Filter实现(实例-防盗链)_mvc


简单测试一下:

ASP.NET MVC 入门10、Action Filter 与 内置的Filter实现(实例-防盗链)_asp.net_50

ASP.NET MVC 入门10、Action Filter 与 内置的Filter实现(实例-防盗链)_缓存_51

对于ActionFilter的应用是很广泛的,这需要你的灵活运用。对于其他应用,你可以参考我之前翻译的ASP.NET MVC Action Filter - 缓存与压缩 这一篇文章。

Enjoy!这个没有什么代码,就暂不传代码了。