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)很重要,很有用。 (一)动作标签 (1)AcceptVerbs 用于指定Http谓词 它有两种构造器: ·AcceptVerbsAttribute(array<String>[]()[]) ·AcceptVerbsAttribute(HttpVerbs) 其中第二种最常用,通过HttpVerbs枚举指定谓词。其中HttpVerbs枚举定义为: public enum HttpVerbs { Delete = 8, Get = 1, Head = 0x10, Post = 2, Put = 4 }
在使用时,通常Get方式(默认)来直接渲染视图,而Post方式用于表单提交。例如在添加新客户时,以链接导航请求视图,直接返回添加页视图,而在表单提交后,Post请求视图,在动作中,处理添加,并返回视图。(说明一下:在浏览请求时,路由到控制器下的动作上,然后由动作处理模型返回视图,所以这里的请求视图也可以理解过去)
(2)ActionName用于指定动作的别名 它所声明的就动作的别名,这个别名与路由访问,视图密切相关。通过这个标签可以创建与别名相同的视图,而不在以动作名访问。 它有一个构造器: 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 然后正常访问了。 这个标签其实也是很有用的,它利于空间管理。 (3)NonAction 用于指明一个控制器方法不作为一个动作 它有一个默认的构造器 如下边这个方法: [NonAction] public ActionResult NoneList() { return View(); }
如果对NoneList方法添加NonAction修饰,则在视图不存在的情况下,会提示视图不存在。而添加这个修饰后,会提示路由错误(动作不存在,所以无法路由)。 (4)OutputCache用于声明动作的输出会被缓存 它有一个默认的构造器,并有很多属性,这里选择几个说明一下: ·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秒。 (5)ValidateInput是否开启危险代码输入验证 默认是验证的 [ValidateInput(true)] public ActionResult Create(contacts contact)
当开启后,在文本框中添加<script>字串,提交会出异常: 从客户端(firstname="<script>")中检测到有潜在危险的 Request.Form 值 (6)HandleError用于过滤异常 它的属性: ·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视图,该ViewDataDictionary的Model属性即是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视图,该ViewDataDictionary的Model属性即是ExceptionContext类的一个实例 那么,现在追踪发生异常的控制器与动作及异常信息内容。在CustomerError视图中: Controller: <%=((HandleErrorInfo)ViewData.Model).ControllerName %> Action: <%=((HandleErrorInfo)ViewData.Model).ActionName %>
然后在访问时:
如果不指定异常过滤器的View属性,则显示默认的视图: 如果在本控制器中没有找到自定义的视图,则显示Shared下的Error视图: 在本控制器下有Error视图: <h2>Error</h2> <h4>这是自定义错误页面</h4>
而在shared下的Error视图为: <h2> Sorry, an error occurred while processing your request. </h2>
此时显示控制器下的视图,当没有时,会显示默认视图。
|
|