• 关于MVC的特性(AuthorizeAttribute)的一些理解


    许多 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必须保持一致 

    个人认为,用处不大

  • 相关阅读:
    复利结对项目 增添
    结对编程-对队友的评价
    复利结对项目
    阅读《构造之法》第4章有感
    单元测试
    实验一 命令解释程序cmd的编写
    阅读《构造之法》1、2、3章有感
    复利计算
    实验总结
    汉堡包评价
  • 原文地址:https://www.cnblogs.com/dengshaojun/p/5961277.html
Copyright © 2020-2023  润新知