zoukankan      html  css  js  c++  java
  • mvc基础系列说谈(8)——修饰标签(修饰属性,过滤器)(上)

    MVC中的修饰标签有很多用途。它以修饰标签形式应用在控制器或控制器中的动作上。

    最先想到的就是AcceptVerbs标签,在创建的时候,如果导航到创建视图,但不创建,则:

    public ActionResult Create()
    {
        
    return View();
    }

    这个动作返回视图,当Get方法向控制器请求时,会调用这个动作;然后,当以Post方法来向控制器请求时,会执行:

    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Create(Customer customer)
    {
        
    try
        {
             
    if (!_service.CreateProduct(customer))
             
    return View();
             
    return RedirectToAction("Index");
        }
        
    catch
        {
            
    return View();
        }
    }

    这里,为这个动作添加了[AcceptVerbs(HttpVerbs.Post)]修饰,它声明当Post向控制器请求时,由这个动作(方法)返回视图。

    这里,AcceptVerbs属性(AcceptVerbsAttribute)很重要,很有用。

    (一)动作标签

    1AcceptVerbs 用于指定Http谓词

    它有两种构造器:

    ·AcceptVerbsAttribute(array<String>[]()[])

    ·AcceptVerbsAttribute(HttpVerbs)

    其中第二种最常用,通过HttpVerbs枚举指定谓词。其中HttpVerbs枚举定义为:

    public enum HttpVerbs
    {
        Delete 
    = 8,
        Get 
    = 1,
        Head 
    = 0x10,
        Post 
    = 2,
        Put 
    = 4
    }

    在使用时,通常Get方式(默认)来直接渲染视图,而Post方式用于表单提交。例如在添加新客户时,以链接导航请求视图,直接返回添加页视图,而在表单提交后,Post请求视图,在动作中,处理添加,并返回视图。(说明一下:在浏览请求时,路由到控制器下的动作上,然后由动作处理模型返回视图,所以这里的请求视图也可以理解过去)

     

    2ActionName用于指定动作的别名

    它所声明的就动作的别名,这个别名与路由访问,视图密切相关。通过这个标签可以创建与别名相同的视图,而不在以动作名访问。

    它有一个构造器:

    public ActionNameAttribute(string name)

    例如:

    public ActionResult NewsList()
    {
        List
    <News> _list = new List<News>();
        ……
        
    return View(_list);
    }

    此时它的视图名为:NewsList,现在通过ActionName标签指定别名:

    [ActionName("NewsList2")]
    public ActionResult NewsList()
    {
        ……
    }

    此时就不能以News/NewsList这个地址来访问,要以News/NewsList2来访问,而此时的视图名应该改为:NewsList2

    然后正常访问了。

    这个标签其实也是很有用的,它利于空间管理。

    3NonAction 用于指明一个控制器方法不作为一个动作

    它有一个默认的构造器

    如下边这个方法:

    [NonAction]
    public ActionResult NoneList()
    {
        
    return View();
    }

    如果对NoneList方法添加NonAction修饰,则在视图不存在的情况下,会提示视图不存在。而添加这个修饰后,会提示路由错误(动作不存在,所以无法路由)。

    4OutputCache用于声明动作的输出会被缓存

    它有一个默认的构造器,并有很多属性,这里选择几个说明一下:

    ·Duration 缓存的时间周期,以秒计

    ·Location 用于指定输出缓存项的位置

    这个属性是一个枚举值:

    AnyClientDownstreamServerNoneServerAndClient

    默认值是Any,表示输出缓存可用于所有请求,包括客户端浏览器、代理服务器或处理请求的服务器上。

    ·VaryByParam 定义了一个分号分隔的字符串列表,用于使输出缓存发生变化。默认情况下,这些字符串与用GET方法属性发送的查询字符串值对应,或与用POST方法 发送的参数对应。当将该属性设置为多参数时,对于每个指定的参数,输出缓存都包含一个请求文档的不同版本。可能的值包括“none”“*”和任何有效的 查询字符串或POST参数名称。

    ·Shared 布尔值,用于指明输出缓存是否可以被多个页共享。默认值为false

    ·CacheProfile  用于定义与该页关联的缓存设置的名称

    ·NoStore 个布尔值,用于决定是否阻止敏感信息的二级存储。

    例如:对时间进行缓存,在视图中:

    <%=DateTime.Now.ToString() %>

     

    动作中:

    [OutputCache(Duration=5,VaryByParam="none",
    Location
    =OutputCacheLocation.Any,NoStore=true)]
    public ActionResult ShowTime()
    {
        
    return View();
    }

    现在缓存5秒。

    5ValidateInput是否开启危险代码输入验证

    默认是验证的

    [ValidateInput(true)]
    public ActionResult Create(contacts contact)

    当开启后,在文本框中添加<script>字串,提交会出异常:

    从客户端(firstname="<script>")中检测到有潜在危险的 Request.Form

    6HandleError用于过滤异常

    它的属性:

    ·ExceptionType 指定过滤器处理那种或哪些类型的异常,如果没有指定该属性,过滤器将会处理所有的异常。

    如果某个Action设置了多个HandleErrorAttribute,可能通过Order属性用来设置使用哪个过滤器。它的值从-1(最高优先级)到任何正整数之间的整数来标识其优先级,值越大,优先级别越低。

    Order属性遵循以下规则:

    应用到Controller上的过滤器将会自动应用到该Controller的所有Action上。如果ControllerAction都应用了HandleErrorAttribute,那么只要Order属性值相同,将会先执行Controller上的过滤器,而后才会执行Action上的过滤器。

    对于相同Order属性的过滤器,其执行先后次序不定。

    如果没有指定Order属性,则默认为-1,这意味着该过滤器将比其他的过滤器优先执行,除非其他过滤器指定了Order-1

    如果有多个过滤器可适用,那么第一个可以处理该异常的过滤器会被首先调用,然后针对该异常的处理将会终结。

    ·View 指定发生异常时过滤器要显示的视图名称

    ASP.NET MVC框架将异常信息存储在ViewDataDictionary中来传递给Error视图,该ViewDataDictionaryModel属性即是ExceptionContext类的一个实例,其中ViewData

    ActionName:目标Action方法的名称

    ControllerName:目标Controller的名称

    Exception:异常对象

    ·Master 指定视图母版的名称,如果有的话

    ·Order 指定过滤器应用的顺序,如果一个Action有多个HandleErrorAttribute过滤器

     

    然后在config文件中要设置CustomerError章节

    <customErrors mode="On" defaultRedirect="Error" />

     

    实例:

    [HandleError(View="CustomError")]
    public ActionResult Create(contacts contact)
    {
        
    throw new Exception("有异常发生了");
    }

    Create时,会抛出异常,此时会显示CustomerError视图。

    Web.config文件中设置:

    <customErrors mode="On" defaultRedirect="Error" />

    异常信息:存储在ViewDataDictionary中来传递给Error视图,该ViewDataDictionaryModel属性即是ExceptionContext类的一个实例

    那么,现在追踪发生异常的控制器与动作及异常信息内容。在CustomerError视图中:

    Controller: <%=((HandleErrorInfo)ViewData.Model).ControllerName %>
    Action: 
    <%=((HandleErrorInfo)ViewData.Model).ActionName %>

    然后在访问时:

    CustomError

    Controller: contact

    Action: create

    Message: 有异常发生了0123456789

     

     

    如果不指定异常过滤器的View属性,则显示默认的视图:

    如果在本控制器中没有找到自定义的视图,则显示Shared下的Error视图:

    在本控制器下有Error视图:

    <h2>Error</h2>
    <h4>这是自定义错误页面</h4>

    而在shared下的Error视图为:

    <h2>
        Sorry, an error occurred while processing your request.
    </h2>

    此时显示控制器下的视图,当没有时,会显示默认视图。

     

  • 相关阅读:
    Java实现 蓝桥杯VIP 算法训练 数的统计
    Java实现 蓝桥杯VIP 算法训练 和为T
    Java实现 蓝桥杯VIP 算法训练 友好数
    Java实现 蓝桥杯VIP 算法训练 连续正整数的和
    Java实现 蓝桥杯VIP 算法训练 寂寞的数
    Java实现 蓝桥杯VIP 算法训练 学做菜
    Java实现 蓝桥杯VIP 算法训练 暗恋
    Java实现 蓝桥杯VIP 算法训练 暗恋
    测试鼠标是否在窗口内,以及测试鼠标是否在窗口停留
    RichEdit 各个版本介绍
  • 原文地址:https://www.cnblogs.com/jams742003/p/1670155.html
Copyright © 2011-2022 走看看