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)很重要,很有用。
(一)动作标签
(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 %>
然后在访问时:
|
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>
此时显示控制器下的视图,当没有时,会显示默认视图。
MVC 修饰标签的更多相关文章
- 关于SpringMVC中找不到<mvc:resources/>标签的解决办法
在springMVC中我们经常会用到<mvc:resources/>标签,但是有些编辑器中的schema过于陈旧.导致找不到<mvc:resources/>标签. 经过试验,有 ...
- SpringMVC(二六) SpringMVC配置文件中使用mvc:view-controller标签
在springmvc中使用mvc:view-controller标签直接将访问url和视图进行映射,而无需要通过控制器. 参考springmvc.xml内容: <?xml version=&qu ...
- mvc:view-controller 标签
一.SpringMVC 会把ModelAndView 的model中的数据放到request 域中 二.如果不想让请求经过任何handler,而直接响应页面,可以使用 mvc:view-control ...
- springMVC配置静态资源访问的<mvc:resources>标签的使用
在springmvc中,为了引用资源的访问不会类似Controller一样被拦截,区分出关注的资源的访问,一般我们在springMVC里面的拦截都会配置为"/",拦截所有的.但是这 ...
- Json.net说法——(一)修饰标签,日期序列化
摘自: http://www.cnblogs.com/jams742003/archive/2009/12/24/1631587.html 通过属性标签自定义JSON序列化 JsonObjectAtt ...
- 使用SpringMVC<mvc:view-controller/>标签时踩的一个坑
<mvc:view-controller>标签 如果我们有些请求只是想跳转页面,不需要来后台处理什么逻辑,我们无法在Action中写一个空方法来跳转,直接在中配置一个如下的视图跳转控制器即 ...
- 【springMVC】<mvc:annotation-driven />标签的使用、作用?
不牵扯源码的显式的作用 在使用interceptor时,显式的作用. 这是不配置<mvc:annotation-driven/>标签时的public boolean preHandle(H ...
- Spring3中的mvc:interceptors标签配置拦截器
mvc:interceptors 这个标签用于注册一个自定义拦截器或者是WebRequestInterceptors. 可以通过定义URL来进行路径请求拦截,可以做到较为细粒度的拦截控制. 例如在配置 ...
- spring mvc 扩展 标签解析
spring mvc 标签解析 InterceptorsBeanDefinitionParser http://www.cnblogs.com/fangjian0423/p/springMVC-int ...
随机推荐
- 自定义EL
1.建一个类 package com.zh.util; public class GetInFo { public static String eval(String infix){ //注意的是这里 ...
- 人工鱼群算法-python实现
AFSIndividual.py import numpy as np import ObjFunction import copy class AFSIndividual: "" ...
- BZOJ-1699 Balanced Lineup 线段树区间最大差值
Balanced Lineup Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 41548 Accepted: 19514 Cas ...
- 【uoj150】 NOIP2015—运输计划
http://uoj.ac/problem/150 (题目链接) 题意 给出一棵树以及m个询问,可以将树上一条边的权值修改为0,求经过这样的修改之后最长的边最短是多少. Solution 老早就听说过 ...
- BZOJ3098 Hash Killer II
Description 这天天气不错,hzhwcmhf神犇给VFleaKing出了一道题: 给你一个长度为N的字符串S,求有多少个不同的长度为L的子串. 子串的定义是S[l].S[l + 1].... ...
- phpstudy2016最新版本mysql无法使用innodb的问题解决
这里顺便记录一下今天遇见的神奇问题,在使用官方最新版本的phpstudy中,其它组件一切正常,但是奇怪的发现mysql是无法开启innodb的,以下为最新的下载地址: http://www.phpst ...
- Weak is not weak,Strong is not strong
问题 今天做浏览器Controller的时候,碰到了一个奇怪的问题:每次pop浏览器controller之后,等几秒,总会碰到类似下面的错误(其中的xxxController就是浏览器或继承他的子类C ...
- MyEclipse------如何添加jspsmartupload.jar+文件上传到服务器
下载地址:http://download.csdn.net/detail/heidan2006/182263 如何添加jspsmartupload.jar:右键“Web”工程->properti ...
- KVM切换声音关闭
Scroll Lock 2次+左右键 实现切换 Scroll Lock 2次+"B" 实现声音的开关
- js中网页图片自动更换的效果
<script> var arr=new Array(); arr[]="url(images/city.jpg)"; arr[]="url(images/d ...