zoukankan      html  css  js  c++  java
  • MVC 修饰标签

    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 用于指定输出缓存项的位置

    这个属性是一个枚举值:

    Any|Client|Downstream|Server|None|ServerAndClient

    默认值是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上。如果Controller和Action都应用了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>

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

     

     

  • 相关阅读:
    (转)Maven实战(三)Eclipse构建Maven项目
    刷欢乐豆的方法
    R-pie()
    R-plot()
    10只老鼠与1000瓶药水
    资源共享
    第一只python小爬虫
    正则表达式之python实现
    马踏棋盘之贪心算法优化
    八皇后之回溯法解决
  • 原文地址:https://www.cnblogs.com/eric-qin/p/4317898.html
Copyright © 2011-2022 走看看