关于MVC的特性(AuthorizeAttribute)的一些理解
许多 Web 应用程序要求在用户登录之后才授予其对受限制内容的访问权限。
在某些应用程序中,即使是登录的用户,也会限制他们可以查看的内容或可以编辑的字段。
要限制对 ASP.NET MVC 视图的访问,您可以限制对呈现视图的操作方法的访问。
为此,MVC 框架提供 AuthorizeAttribute 类。
MVC的一些特性,如下:
BindAttribute(限制实体属性)RemoteAttribute(远程验证,需要页面使用jquery.validate.js和jquery.validate.unobtrusive.js)HandleErrorAttribute(根据异常类型直接跳转到相应的错误页面)HiddenInputAttribute(在Model中直接控制页面输入框显示,用处不大)
BindAttribute
使用BindAttribute的目的是限制用户在提交form表单时使用合适且正确的值。当我们提交一个表单时,就会检查每一个实体上绑定的特性。
假设我们已经有下面一个Employee实体类:

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:

[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:

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方法将被执行并检查邮箱是否存在。
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去处理异常,如下:

[HandleError()]
public ActionResult CheckError()
{
int a = 10;
int b = 0;
int k = a / b;
return View();
}
在web.config文件中,我们在<system.web>中添加如下两行:
<customErrors mode ="On" defaultRedirect ="Error.cshtml">
</customErrors>
在shared文件夹下创建一个视图Error.cshtml,然后运行程序,如果运行上面的CheckError()方法,刚创建的Error.cshtml将会显示出来。
还可以根据异常类型的不同跳转到不同的错误界面。

[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特性。

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)的一些理解的更多相关文章
- MVC常用特性
MVC常用特性使用 简介 在以前的文章中,我和大家讨论如何用SingalR和数据库通知来完成一个消息监控应用. 在上一篇文章中,我介绍了如何在MVC中对MongoDB进行CRUD操作. 今天,我将 ...
- ASP.NET MVC最新特性
问题: 既然我说对ASP.NET MVC很熟很懂,对新技术很感兴趣,那么问题是: 当前最新版MVC是什么?你用的哪个版本?相比前一个版本有什么新的特性? 解析: 在面试的时候,为了争取面试官的好感,显 ...
- 【重构前端知识体系之HTML】讲讲对HTML5的一大特性——语义化的理解
[重构前端知识体系之HTML]讲讲对HTML5的一大特性--语义化的理解 引言 在讲什么是语义化之前,先看看语义化的背景. 在之前的文章中提到HTML最重要的特性,那就是标签.但是项目一大,标签多的看 ...
- 关于MVC框架中的Model的理解
一直以来对MVC结构中的Model层很不理解. 虽然Model层封装了一些方法,在查询和属性访问的时候提供了一些便利,但是实际使用中更多感受到的是Model层带来的限制,用起来十分别扭. 之前继承的一 ...
- MVC常用特性使用
简介 在以前的文章中,我和大家讨论如何用SingalR和数据库通知来完成一个消息监控应用. 在上一篇文章中,我介绍了如何在MVC中对MongoDB进行CRUD操作. 今天,我将继续介绍一些在开发中非常 ...
- ASP.NET MVC中利用AuthorizeAttribute实现访问身份是否合法以及Cookie过期问题的处理
话说来到上海已经快半年了,时光如白驹过隙,稍微不注意,时间就溜走了,倒是没有那么忙碌,闲暇之际来博客园还是比较多的,记得上次在逛博问的时候看到有同志在问MVC中Cookie过期后如何作相关处理,他在阐 ...
- mvc Routing特性优化
在mvc中,Url地址是利用routing特性来支持,但是这个Routing有个问题,多个不同的地址和指向同一个action方法, 例如: http://test.com (默认) http://te ...
- MVC 授权过滤器 AuthorizeAttribute
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...
- .NET [MVC] 利用特性捕捉异常
声明:本代码只适用于.NET MVC. 先创建一个类继承ActionFilterAttribute这个抽象类以及实现IExceptionFilter接口,并实现它的方法OnException. 代码如 ...
随机推荐
- linux service 简单易懂贴
service用于管理Linux操作系统中服务的命令 1.不是在所有linux发行版本中都有.主要是在redhat.fedora.mandriva和centos中. 2. 命令位于/sbin目录下,用 ...
- Android开发学习之路--Android Studio项目目录结构简介
既然已经搭建好环境了,那就对Android Studio中项目目录结构做个简单的了解了,这里以最简单的Hello工程为例子,新建好工程后看如下三个工程视图: 1.Android工程 manifests ...
- Qt中实现启动画面
纵所周之,当一个程序的启动比较耗时的时候,为了不让用户枯燥的等待或者是误以为程序运行异常了,所以我们都会在启动比较耗时的程序中加上启动界面 ,例如office软件等等. 在Qt中实现启动界面,主要就是 ...
- Android初级教程小案例之单选框RadioGroup与复选框CheckBox
Android里面的单选框和html中的其实是一样的效果.这里用到两个控件:CheckBox和RadioGroup.直接上代码: radio.xml布局文件: <?xml version=&qu ...
- 根据Schema写出XML文档四部曲
Schema约束文档本身就是一个XML文档,扩展名为xsd 难点:XML文档的根元素怎么写? 如下4步曲: a.首先看Schema文档,找到根元素 <?xml version="1.0 ...
- Leetcode_38_count-and-say
本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/41257397 The count-and-say sequ ...
- 我眼中的Linux设备树(五 根节点)
五 根节点一个最简单的设备树必须包含根节点,cpus节点,memory节点.根节点的名字及全路径都是"/",至少需要包含model和compatible两个属性.model属性我们 ...
- Linux下修改主机名步骤
Linux下修改主机名为gpdb 步骤一.运行vi /etc/sysconfig/network命令 NETWORKING=yesHOSTNAME=gpdb 步骤二.运行hostname gpdb命令 ...
- APPCORE Routine APIs
Introduction to APPCORE Routine APIs This chapter provides you with specifications for calling many ...
- MacBook 最近发现的一些问题和技巧
本猫的mba最近键盘莫名会失灵,但用鼠标切换其他用户时时好的,切换回来又不行,体现如下: 1.Spotlight里可以输入,其他不可以 2.cmd+tab可以切换进程 现在只有重启后才可以恢复. 网上 ...