许多 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. 最简单的基于FFmpeg的封装格式处理:视音频分离器简化版(demuxer-simple)

    ===================================================== 最简单的基于FFmpeg的封装格式处理系列文章列表: 最简单的基于FFmpeg的封装格式处理 ...

  2. 【VSTS 日志】VSTS 所有功能,看这个页面就够了!

    随着Connect();//2015大会的结束,一大波的好消息随之而来.今天小编刚刚发现了Visual Studio Team Services / Team Foundation Server 的完 ...

  3. Oracle EBS OM 主要API示例

    1, Book order Oe_Order_Pub.Process_Order ( 1 , Fnd_Api.G_FALSE , Fnd_Api.G_FALSE , Fnd_Api.G_FALSE , ...

  4. Android 基于MVC的MVVM模式开发

    由skay整理  http://blog.csdn.net/sk719887916/article/details/50386144 什么是MVVM 我们一步步来,从MVC开始. MVC 我们都知道, ...

  5. Oracle EBS R12多组织(多OU)访问架构

    Oracle EBS R12多组织访问架构 多组织架构实现了经营单位(OU)的数据安全性,在底层数据表中有一列ORG_ID来记录数据所属的经营单一,所有多OU的基表都是以"_ALL" ...

  6. Dynamics CRM2013 picklist下拉项行数控制

    CRM2013和前面几个版本相比有了很大的变化,本文中讲述的picklist亦然.CRM2013的picklist效果图如下所示 目前能看到的是会根据下拉内容项的数量不同而显示不同的下拉行数,但有时客 ...

  7. Linux IPC实践(2) --匿名PIPE

    管道概念 管道是Unix中最古老的进程间通信的形式,我们把从一个进程连接到另一个进程的一个数据流称为一个"管道", 管道的本质是固定大小的内核缓冲区; 如:ps aux | gre ...

  8. 我的Json解析实战

    所谓json,其实就是在我们访问一个网页的接口的时候,服务器端传送给我们客户端的一种数据的结构,当然我们向服务器端发送的数据有时也会转换成json格式,当然了,这不是必须的.最近在解析一些json字符 ...

  9. OC第二天—封装

    /.锁定头文件的方法 1. 打开终端 2. 进入到Xcode的目录, 命令:   cd /Applications/Xcode.app 3. 把系统头文件修改为只读, 命令:   sudo chown ...

  10. AngularJS进阶(三十三)书海拾贝之简介AngularJS中使用factory和service的方法

    简介AngularJS中使用factory和service的方法 AngularJS支持使用服务的体系结构"关注点分离"的概念.服务是JavaScript函数,并负责只做一个特定的 ...