许多 Web 应用程序要求在用户登录之后才授予其对受限制内容的访问权限。

在某些应用程序中,即使是登录的用户,也会限制他们可以查看的内容或可以编辑的字段。

要限制对 ASP.NET MVC 视图的访问,您可以限制对呈现视图的操作方法的访问。

为此,MVC 框架提供 AuthorizeAttribute 类。

MVC的一些特性,如下:

  1. BindAttribute(限制实体属性)
  2. RemoteAttribute(远程验证,需要页面使用jquery.validate.js和jquery.validate.unobtrusive.js)
  3. HandleErrorAttribute(根据异常类型直接跳转到相应的错误页面)
  4. HiddenInputAttribute(在Model中直接控制页面输入框显示,用处不大)

BindAttribute

使用BindAttribute的目的是限制用户在提交form表单时使用合适且正确的值。当我们提交一个表单时,就会检查每一个实体上绑定的特性。

假设我们已经有下面一个Employee实体类:

  1. public class Employee
    {
    public string Name { get; set; }
    public string Email { get; set; }
    public string Address { get; set; }
    public string PhoneNo { get; set; }
    }

    建立一个EmployeeController,里面添加两个Action:

  1. [HttpGet]
    public ActionResult EmployeeRegister()
    {
    return View();
    }
    [HttpPost]
    public ActionResult EmployeeRegister(Employee emp)
    {
    return View();
    }

给第一个Action建立视图,并且发送post表单数据过来。

这样在第二个Action中,就会接收到参数,自动转成Employee类,包含4个属性

现在如果我们只想提交Email,Name和PhoneNo,而我们不想提交Address,这时我们可以在实体类上添加如下特性:

[Bind(Exclude="Address")]
public class Employee
{
public string Name { get; set; }
public string Email { get; set; }
public string Address { get; set; }
public string PhoneNo { get; set; }
}

此时其他三个属性正常,Address变成了null.

我们也可以将BindAttribute直接用在Action的参数中,像下面这样:

[HttpPost]
public ActionResult EmployeeRegister([Bind(Exclude = "Address")]Employee emp)
{
return View();
}

注意:BindAttribute位于System.Web.Mvc命名空间下

Remote Attribute

假设我们有一个注册表单,里面有邮箱文本框,当输入邮箱后,我们想检查输入的邮箱是否在数据库中已经存在,如果存在,则不提交表单,这时我们可以使用RemoteAttribute,通过RemoteAttribute,我们可以在进入Action前自动先进行一些服务端验证。

我们可以在下面的例子中使用RemoteAttribute:

  1. public class Employee
    {
    public string Name { get; set; }
    [Remote("CheckEmail","Employee",ErrorMessage="Email is already exist")]
    public string Email { get; set; }
    public string Address { get; set; }
    public string PhoneNo { get; set; }
    }

RemoteAttribute的第一个参数是一个Action名字,第二个是Controller名字,第三个是如果邮箱已存在后显示给用户看的提示信息。当我们输入完邮箱后,CheckEmail方法将被执行并检查邮箱是否存在。

  1. public JsonResult CheckEmail(string Email)
    {
    //Check here in database if it exist in database return true else false.
    return Json(false, JsonRequestBehavior.AllowGet);
    }

此时页面上邮箱的输入框一旦发生onchange,就会自动发送异步请求到CheckEmail方法,页面可以使用如下代码:

@Html.ValidationMessageFor(model => model.Email, "", new { @class = "text-danger" })

来配合处理

个人认为,该特性基本没什么用

HandleError Attribute

我们已经有很多方法在MVC中处理异常,比如用try catch,或者使用Filter,或者通过第三方库比如elmah。但是MVC也提供了一个HandleErrorAttribute去处理异常,如下:

  1. [HandleError()]
    public ActionResult CheckError()
    {
    int a = 10;
    int b = 0;
    int k = a / b;
    return View();
    }

在web.config文件中,我们在<system.web>中添加如下两行:

  1. <customErrors mode ="On" defaultRedirect ="Error.cshtml">
    </customErrors>

在shared文件夹下创建一个视图Error.cshtml,然后运行程序,如果运行上面的CheckError()方法,刚创建的Error.cshtml将会显示出来。

还可以根据异常类型的不同跳转到不同的错误界面。

  1. [HandleError(ExceptionType=typeof(DivideByZeroException),View="尝试除以0的View")]
    [HandleError(ExceptionType = typeof(NullReferenceException), View = "引用null对象的View")]
    public ActionResult CheckError()
    {
    int a = 10;
    int b = 0;
    int k = a / b;
    return View();
    }

可以重写该特性进行错误日志记录!调用方式有两种:1、global全局注册,2、加在控制器或Action上

使用 handleError attribute 有以下局限:

1. 不支持exception记录
2. 无法捕捉到500之外的http exception
3. controller之外抛出的异常无法处理
4. ajax调用出现exception时,会将错误页面内容返回

HiddenInput Attribute

如果我们想对用户隐藏一些实体字段,我们可以使用HiddenInput特性。

  1. public class Employee
    {
    [HiddenInput(DisplayValue=false)]
    public string Name { get; set; }
    [Remote("CheckEmail","Employee",ErrorMessage="Email is already exist")]
    public string Email { get; set; }
    public string Address { get; set; }
    public string PhoneNo { get; set; }
    }

这样页面上Name的输入框将不会出现,必须使用如下代码才可实现控制效果:

@Html.EditorFor(model => model.Name, new {})

强类型控制,Name和页面头部引用@model xxx.Models.Employee必须保持一致

个人认为,用处不大

关于MVC的特性(AuthorizeAttribute)的一些理解的更多相关文章

  1. MVC常用特性

    MVC常用特性使用   简介 在以前的文章中,我和大家讨论如何用SingalR和数据库通知来完成一个消息监控应用. 在上一篇文章中,我介绍了如何在MVC中对MongoDB进行CRUD操作. 今天,我将 ...

  2. ASP.NET MVC最新特性

    问题: 既然我说对ASP.NET MVC很熟很懂,对新技术很感兴趣,那么问题是: 当前最新版MVC是什么?你用的哪个版本?相比前一个版本有什么新的特性? 解析: 在面试的时候,为了争取面试官的好感,显 ...

  3. 【重构前端知识体系之HTML】讲讲对HTML5的一大特性——语义化的理解

    [重构前端知识体系之HTML]讲讲对HTML5的一大特性--语义化的理解 引言 在讲什么是语义化之前,先看看语义化的背景. 在之前的文章中提到HTML最重要的特性,那就是标签.但是项目一大,标签多的看 ...

  4. 关于MVC框架中的Model的理解

    一直以来对MVC结构中的Model层很不理解. 虽然Model层封装了一些方法,在查询和属性访问的时候提供了一些便利,但是实际使用中更多感受到的是Model层带来的限制,用起来十分别扭. 之前继承的一 ...

  5. MVC常用特性使用

    简介 在以前的文章中,我和大家讨论如何用SingalR和数据库通知来完成一个消息监控应用. 在上一篇文章中,我介绍了如何在MVC中对MongoDB进行CRUD操作. 今天,我将继续介绍一些在开发中非常 ...

  6. ASP.NET MVC中利用AuthorizeAttribute实现访问身份是否合法以及Cookie过期问题的处理

    话说来到上海已经快半年了,时光如白驹过隙,稍微不注意,时间就溜走了,倒是没有那么忙碌,闲暇之际来博客园还是比较多的,记得上次在逛博问的时候看到有同志在问MVC中Cookie过期后如何作相关处理,他在阐 ...

  7. mvc Routing特性优化

    在mvc中,Url地址是利用routing特性来支持,但是这个Routing有个问题,多个不同的地址和指向同一个action方法, 例如: http://test.com (默认) http://te ...

  8. MVC 授权过滤器 AuthorizeAttribute

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...

  9. .NET [MVC] 利用特性捕捉异常

    声明:本代码只适用于.NET MVC. 先创建一个类继承ActionFilterAttribute这个抽象类以及实现IExceptionFilter接口,并实现它的方法OnException. 代码如 ...

随机推荐

  1. 【Unity Shaders】Vertex Magic —— 访问顶点颜色

    本系列主要参考<Unity Shaders and Effects Cookbook>一书(感谢原书作者),同时会加上一点个人理解或拓展. 这里是本书所有的插图.这里是本书所需的代码和资源 ...

  2. Linux技巧:一次删除一百万个文件的最快方法

    最初的测评 昨天,我看到一个非常有趣的删除一个目录下的海量文件的方法.这个方法来自http://www.quora.com/How-can-someone-rapidly-delete-400-000 ...

  3. SDL2源代码分析8:视频显示总结

    ===================================================== SDL源代码分析系列文章列表: SDL2源代码分析1:初始化(SDL_Init()) SDL ...

  4. 高性能nosql ledisdb设计与实现 (2):replication

    ledisdb现在已经支持replication机制,为ledisdb的高可用做出了保障. 使用 假设master的ip为10.20.187.100,端口6380,slave的ip为10.20.187 ...

  5. cocos2d-js(二)cocos2d-js的基本语法与类的简介

    基本语法: 1.类的定义 一般类都是集成Scene或者Layer: var myLayer = cc.Layer.extend({类的内容}); 2类内的成员变量与方法: 2.1成员变量的声明: 变量 ...

  6. [C++学习历程]基础部分 C++中的函数中的值参数、地址参数、引用参数实际例子

    本文地址:http://blog.csdn.net/sushengmiyan/article/details/20406269 作者:sushengmiyan // sushengmiyanTest. ...

  7. OpenCV Python教程(1、图像的载入、显示和保存)

    原文地址:http://blog.csdn.net/sunny2038/article/details/9057415 转载请详细注明原作者及出处,谢谢! 本文是OpenCV  2 Computer ...

  8. linux的date的几个例子

    shell脚本为test.sh: input=$1 echo "sdfa:${input}" echo ${input} echo "dfadf"${input ...

  9. 【一天一道LeetCode】#31. Next Permutation

    一天一道LeetCode系列 (一)题目 Implement next permutation, which rearranges numbers into the lexicographically ...

  10. 新书《Ext JS 4.2 实战》终于出炉了

    在清华大学出版社网站看到了书籍信息了,具体地址是:http://www.tup.tsinghua.edu.cn/book/Showbook.asp?CPBH=056140-01&DJ=51 预 ...