戴尔合作伙伴查询现在不是和招商银行有合作吗

java,spring mvc,文件下载 - Forgidaved - ITeye技术网站
博客分类:
&&&& 最近由于项目需要,要实现excel文件的下载,通过spring mvc的相关文档,找到了spring mvc支持的文件下载的通用写法,如下所示:
@RequestMapping(value = "download", method = RequestMethod.GET)
public ResponseEntity&byte[]& download(@RequestParam("fileName") String fileName)
throws IOException {
HttpHeaders headers = new HttpHeaders();
String rspName = resourceServerPath + fileN
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
headers.setContentDispositionFormData("attachment", new String(fileName.getBytes("gb2312"),
"iso-8859-1"));
File file = new File(rspName);
byte[] bytes = FileUtils.readFileToByteArray(file);
if (file.exists()) {
file.delete();
} catch (Exception e) {
e.printStackTrace();
return new ResponseEntity&byte[]&(bytes, headers, HttpStatus.CREATED);
&&& 由于是在chrome下开发的,开发完测试没问题,就直接发布出去了。发布后,偶尔会有客户反应在IE浏览器中没法导出文件。今天抽了点时间到IE里面重现,发现确实是自己没有好好在IE环境下测试。经过各方面的咨询,发现是IE浏览器貌似不支持http 201响应码,便马上将返回的响应码改为200,改后的代码如下所示:
return new ResponseEntity&byte[]&(bytes, headers, HttpStatus.OK);
ForgiDaved
浏览: 39010 次
来自: 深圳
能不能一部分一部分下载,类似流的buffer那种.这种方式下载 ...
世界太假我们太傻 写道 请问一下,为什么改变不了样式,当点击表 ...
请问一下,为什么改变不了样式,当点击表头的时候改变图片怎么弄 ...
feizhang666 写道代码没写全吧~~~ 哥们,你是指哪 ...15893人阅读
o&&&&&& 模型(Model) “数据模型”(Model)用于封装与应用程序的业务逻辑相关的数据以及对数据的处理方法。“模型”有对数据直接访问的权力,例如对数据库的访问。“模型”不依赖“视图”和“控制器”,也就是说,模型不关心它会被如何显示或是如何被操作。但是模型中数据的变化一般会通过一种刷新机制被公布。为了实现这种机制,那些用于监视此模型的视图必须事先在此模型上注册,从而,视图可以了解在数据模型上发生的改变。
o&&&&&& 视图(View) 视图层能够实现数据有目的的显示(理论上,这不是必需的)。在视图中一般没有程序上的逻辑。为了实现视图上的刷新功能,视图需要访问它监视的数据模型(Model),因此应该事先在被它监视的数据那里注册。
o&&&&&& 控制器(Controller) 控制器起到不同层面间的组织作用,用于控制应用程序的流程。它处理事件并作出响应。“事件”包括用户的行为和数据模型上的改变。
网站的访问流程:
o&&&&&& 1. 当第一个请求从客户端发起的时候,首先执行的是Global.asax中的Application_Start()方法来完成一些初始化工作,其中重要的一步是RegisterRoutes方法,这个方法指定了如何将url映射到具体的方法上,稍后详解。
o&&&&&& 2. 根据第一步中指定的映射表生成一个RouteData对象,利用这个对象来创建一个RequestContext对象。
o&&&&&& &3. MvcRouteHandler创建一个MvcHandler,并将RequestContext对象传给MvcHandler。
o&&&&&& &4. MvcHandler对象利用RequestContext对象确定一个IControllerFactory对象来创建Controller对象。
o&&&&&& &5. MvcHandler对象调用Controller对象的Execute()方法。
o&&&&&& &6. Controller的ControolerActionInvoker对象决定调用controller的哪个具体的action方法。
o&&&&&& &7. Action方法接受用户参数,执行方法,返回一个Result类型的对象。
&使用@model关键字可以定义一个Action里所对应的一个模型(经常可以叫他实体类),
其实是对动态变量进行实例化,这样就可以直接在cshtml文件中调用“Model”变量。
而这个模型的实例,需要通过Controller进行传输,如果没有则“Model”将为null。
&模型可以是一个实体类,也可以是一个列表实例,字典对象都可以进行定义,但是和
Controller中的Action传回来的实例一定要一样,否则将会出现错误。例如我们获取
用户实例,并且在页面上呈现用户的具体信息,这样就可以将用户实例返回给前台
模型的定义及验证标记如下示例:
Model类中可以添加的验证标记:
1. 必填字段
[Required]
public string FirstName { }
2. 字段长度
[StringLength(160)]
public string FirstName { }
要求至少n位:
[StringLength(160, MinimumLength=3)]
public string FirstName { }
3. 正则验证
[RegularExpression(@”[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}”)]
public string Email { }
[Range(35,44)]
public int Age { }
小数的情况:
[Range(typeof(decimal), “0.00”, “49.99”)]
public decimal Price { }
5. 服务端参与的验证
[Remote(“CheckUserName”, “Account”)]
public string UserName { }
然后在AccountController里指定一个CheckUserName方法:
public JsonResult CheckUserName(stringusername)
&&&var result = Membership.FindUsersByName(username).Count == 0;
&&&return Json(result, JsonRequestBehavior.AllowGet);
[RegularExpression(@”[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}”)]
public string Email { }
[Compare(“Email”)]
public string EmailConfirm { }
7. 自定义错误消息
[RegularExpression(@”[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}”,
&&&&&&&&&&&&&&&&&& ErrorMessage=”Email doesn’tlook like a valid email address.”)]
public string Email { }
普通文本:
[Required(ErrorMessage=”Your last name isrequired”)]
[StringLength(160, ErrorMessage=”Your lastname is too long”)]
public string LastName { }
[Required(ErrorMessage=”Your {0} isrequired.”)]
[StringLength(160, ErrorMessage=”{0} is toolong.”)]
public string LastName { }
与Controller
Shared/_Layout.cshtml
、HtmlHelper
ActionLink
@Html.ActionLink(&Text&,&&Index&,&&Home&,&new&{&page&=&1&},&new&{&id&=&&link1&&})
&a&href=&/?page=1&&id=&link1&&Text&/a&
其实就是用一个新建立的RouteValueDictionary的对象(new{}所实例化的对象将会等价转换为RouteValueDictionary)来替原来的Action,Controller字符串的单独指定。
示例:@Html.RouteLink(&Text&,new { action = &index&, page = 1 }, new { id=&link1&})
可通过路由名称指定指向某路由路径。
示例:@Html.RouteLink(&关于&,&about&, new { page = 1 }, new { id = &link1& })
其中about为路由名称
表单两种方式:
1、&form action=&@Url.Action(&Index&,&Home&)&method=&post&&&/form&
2、@using(Html.BeginForm(&Index&,&Movies&,FormMethod.Get)){}
3、绑定下拉框示例:
&& @Html.DropDownList(&movieGenre&,&All&)
&a href='&%=Url.Action(&DemoAction&,&DemoController&, new{id=2,category=5 },&https&)%&' title=&&&指定传输协议生成URL&/a&&br/&
解释为:&ahref='https://localhost/DemoController/DemoAction?id=2&category=5'title=&&&指定传输协议生成URL&/a&&br /&
、Controller
从Model获取数据,然后通过ViewData传递给View数据
可以使用不同的View呈现数据
ActionResult的其它返回值:JsonResult、RedirectResult
PartialView(自定义控件)、View方法
ViewData、TempData传值
ViewData只能在当前Action中有效&
TempData可以类似于Session一样到其它页面仍然存在,但只限一页的访问
TempData一般用于临时的缓存内容或抛出错误页面时传递错误信息
绑定View表单下拉框示例:
ValidateAntiForgeryToken 特性,这个特性用来阻止伪造的请求,它和视图(Views\Movies\Edit.cshtml)中的@Html.AntiForgeryToken() 是成对出现的。
显示验证错误信息
@Html.ValidationSummary(true, &&,new { @class = &text-danger& })
、ajax提交
1、显示当前页面层
2、提交数据到controller中方法如下图代码
3、ajaxHelper
1、Ajax异步请求ContentController
ContentController直接以字符串形式返回实例的内容,在Index.cshtml中使用ActionLink,如下:
@Ajax.ActionLink(&AjaxContentController&,&getEntry&, new { id = item.Id }, new AjaxOptions { HttpMethod =&Post&, UpdateTargetId = &detailsID&, InsertionMode =InsertionMode.Replace })
相应的Controller:
public string getEntry(int id = 0) {
&&&&&&&&&&& GuestbookEntryentry = _db.Entries.First(c =& c.Id == id);
&&&&&&&&&&& returnentry.D
& 2、使用Json格式返回
@Ajax.ActionLink(&AjaxJsonController&,&JsonDetails&, new { id = item.Id }, new AjaxOptions { HttpMethod =&Post&, InsertionMode = InsertionMode.Replace, OnSuccess = &Show();&})
相应的Controller:
public ActionResult JsonDetails(int id = 0)
&&&&&&&&&&& GuestbookEntryentry = _db.Entries.First(c =& c.Id == id);
&&&&&&&&&&& return Json(entry,JsonRequestBehavior.AllowGet);
注意:在使用Json格式返回数据时,由于安全原因,只接收Post请求,因此在这里使用JsonRequestBehavior.AllowGet来允许Get方式请求。
同时需要在Index.cshtml中添加请求成功的相应函数Show:
&script type=&text/javascript&&
&&&&&&& function Show(data) {
&&&&&&&&&&&$(&#detailsID&).html(&姓名:& + data.Name+ & 消息:& + data.Message);
1、多个区域中增加多个member,而每个member中存在一个路由
2、在项目中可以设置一个总路由指定到某个命名空间。然后在每个member区域设置单独路由。
MapRoute是RouteCollection的扩展方法,同时还有IngnoreRoute,而Add则是实例方法,相对来说要使用Add来调用比较复杂(包含刚才提到的5大属性),而MapRoute则相对简洁。
routes.Add(new Route(&blog/{action}/{author}&,
&&&&&&&&&&&&&&&&&new RouteValueDictionary { {&action&, &show& }, {&author&, &miracle&} },
&&&&&&&&&&&&&&&& new MvcRouteHandler()));
routes.MapRoute(
&&&&& &Article&, // 路由名称
&&&&& &blog/{action}/{author}&, // 带有参数的 URL
&&&&& new { controller = &Home&, action = &show&, author = &miracle& }
当用户输入URL地址发送请求时,UrlRoutingModule类就会到路由表(RouteTable)中解析与请求匹配的路由,然后将该路由分发到路由处理程序(IRouteHandler),并连同RequestContext一起再次分发到Mvc处理程序(IHttpHandler),定位相关的控制器并执行相关的动作实现输出。以下的整个过程的示意图。
在传统的Web站点中使用路由(一般情况下用户将传统站点转化为MVC站点的项目迁移过渡)。主要包含以下两个步骤:
<span style="color:#、常见实现IRouteHandler接口的WebFormRouteHandler类,返回实现IHttpHandler接口的实例化对象(实际上任何一个Page都是一个IHttpHandler实例对象)。
public class WebFormRouteHandler : IRouteHandler
&&& public stringVirtualPath { private set; }
&&& //初始化虚拟路径
&&& publicWebFormRouteHandler(string virtualPath)
&&&&&&& this.VirtualPath= virtualP
&&& public IHttpHandler GetHttpHandler(RequestContext requestContext)
&&&&&&& //创建实例化的页面对象
&&&&&&& var page =BuildManager.CreateInstanceFromVirtualPath(VirtualPath, typeof(Page)) as IHttpH
&&&&&&& return
<span style="color:#、配置全局应用程序类(Global.asax),实现路由的映射。
routes.MapMvcAttributeRoutes(); //Attribute路由注册
AreaRegistration.RegisterAllAreas();//区域路由注册
注:增加区域之后,防止路由重复,需在默认路由中为命名空间赋&#20540;。
、路由定义和 Action 放在一起:
[Route(&Home/Index/{id}&)]
public ActionResult Index() {... }
与通用路由是否可以一起使用待验证,已经验证,可以一起使用。以Attribute这里为主。
、URL可选参数和默认&#20540;
[Route(&Home/Index/{id?}&)]
匹配//Home/Index或者/Home/Index/id
//匹配:/books/lang
//匹配:/books/lang/en
//匹配:/books/lang/he
//如果URL不传递 lang 参数,则lang的&#20540;为“en”
[Route(&books/lang/{lang=en}&)]
//匹配:/Home
[Route(&Home&)]
publicActionResult Index() { ... }
//匹配:/ Home/5
[Route(&Home/{id}&)]
publicActionResult Show(int id) { ... }
//匹配:/ Home/5/edit
[Route(&Home/{id}/edit&)]
publicActionResult Edit(int id) { ... }
或者在controller前面增加属性[RoutePrefix(&Home&)]
、默认路由
[RoutePrefix(&promotions&)]
[Route(&{action=index}&)]
默认promotions,action为index
ActionResult前面增加[Route]则覆盖默认路由。
、路由约束
路由约束可以让你指定参数的类型以及范围等,&#26684;式为:{参数:约束},举例如下:
// 匹配: /users/5
[Route(&users/{id:int}&]
// 这里约束了参数“id”必须为整数类型
publicActionResult GetUserById(int id) { ... }
下面是支持的路由约束列表:
Constraint
Description
Matches uppercase or lowercase Latin alphabet characters (a-z, A-Z)
Matches a Boolean value.
Matches a&DateTime&value.
{x:datetime}
Matches a decimal value.
{x:decimal}
Matches a 64-bit floating-point value.
{x:double}
Matches a 32-bit floating-point value.
Matches a GUID value.
Matches a 32-bit integer value.
Matches a string with the specified length or within a specified range of lengths.
{x:length(6)}
{x:length(1,20)}
Matches a 64-bit integer value.
Matches an integer with a maximum value.
{x:max(10)}
Matches a string with a maximum length.
{x:maxlength(10)}
Matches an integer with a minimum value.
{x:min(10)}
Matches a string with a minimum length.
{x:minlength(10)}
Matches an integer within a range of values.
{x:range(10,50)}
Matches a regular expression.
{x:regex(^\d{3}-\d{3}-\d{4}$)}
你可以在一个参数后面应用多个约束,用冒号分隔它们,如下:
// 匹配: /users/5
// 但是不匹配 /users/
因为id的&#20540;已经超过了int.MaxValue,
// 也不匹配 /users/0
因为后面有个min(1)约束,id
的&#20540;必须大于等于 1.
[Route(&users/{id:int:min(1)}&)]
publicActionResult GetUserById(int id) { ... }
、自定义约束
、路由名称
[Route(&menu&,Name = &mainmenu&)]
publicActionResult MainMenu() { ... }
可以使用Url.RouteUrl
来生成相应的 URL:
&ahref=&@Url.RouteUrl(&mainmenu&)&&Main menu&/a&
、Areas区域
Area概念对组织大型Web应用程序很有帮助,在Attribute路由中当然少不了对它的支持,只要使用 [RouteArea],就可以把 Controller 归属到某一个 Area 下
删除Area 下的AreaRegistration 类
[RouteArea(&Admin&)]
[RoutePrefix(&menu&)]
[Route(&{action}&)]
publicclass MenuController : Controller
//匹配:/admin/menu/login
publicActionResult Login() { ... }
、实现对HTMLHelper的扩展。
新建文件夹:Extensions,文件夹Extensions中添加自定义扩展。
使用时,view页面必须加入:@using MVCMovie.E//自定义。
页面引用如:@Html.QINLabel(&male&, &男&)
public static string Label(this HtmlHelperhelper, string name, string value)
&&&return string.Format(&&labelfor='{0}'&{1}&/label&&br /&&, name, value);
、AjaxHelper的扩展
新增扩展类
public class AjaxHelperExtController :Controller
&&&&&&&// GET: /AjaxHelperExt/
&&&&&&&public ActionResult AjaxHelperExt()
&&&&&&&&&&&return View();
&&&&&&&public ActionResult GetTime()
&&&&&&&&&&&return Content(&Now Time:& &#43; DateTime.Now.ToString());
最后在jquery.unobtrusive-ajax.js里面加上TextBox的Keyup事件绑定
$(&input[type=text][data-ajax=true]&).live(&keyup&,function (evt) {
&&&&&&&asyncRequest(this, { type: &GET& ,data: [{ name:$(this).attr('name'), value: $(this).val()}] });
&divid=&divTime&&&/div&
@Ajax.Textbox(&search&,
&&&new AjaxOptions
&&&&&&&Url = @Url.Action(&GetTime&) ,
&&&&&&&UpdateTargetId = &divTime&,
&&&&&&&InsertionMode = InsertionMode.Replace
new { size = 50 })
注:同时需要在页面中引入MicrosoftAjax.js,MicrosoftMvcAjax.js
在web.config中增加client side validation and unobtrusive javascript 两个配置
&addkey=&ClientValidationEnabled& value=&true& /&
&addkey=&UnobtrusiveJavaScriptEnabled& value=&true& /&
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:20257次
排名:千里之外2011年9月 总版技术专家分月排行榜第一2011年8月 总版技术专家分月排行榜第一2011年7月 总版技术专家分月排行榜第一2011年6月 总版技术专家分月排行榜第一2011年5月 总版技术专家分月排行榜第一2011年4月 总版技术专家分月排行榜第一
2011年3月 总版技术专家分月排行榜第二2011年2月 总版技术专家分月排行榜第二
本帖子已过去太久远了,不再提供回复功能。[Asp.net MVC]Asp.net MVC5系列——在模型中添加验证规则
上篇文章中介绍了添加数据,在提交表单的数据的时候,我们需要对数据的合法性进行校验,Asp.net MVC5中,提供一种方便的验证方式。本文介绍如何在我们的Student模型中添加一些验证规则,同时确认当用户使用我们的应用程序创建或编辑学生信息时将使用这些验证规则对用户输入的信息进行检查。
在ASP.NET MVC中,有一条作为核心的原则,就是DRY(&Don&t Repeat Yourself,中文意思为:不要让开发者重复做同样的事情)原则。ASP.NET MVC提倡让开发者&一处定义、处处可用&。这样可以减少开发者的代码编写量,同时也更加便于代码的维护。
在模型中添加验证规则
首先,让我们在Student类中追加一些验证规则。
打开Student.cs文件,在文件的头部追加一条引用ponentModel.DataAnnotations命名空间的using语句,代码如下所示。
1 & ponentModel.DataA
这个ponentModel.DataAnnotations命名空间是.NET Framework中的一个命名空间。它提供了很多内建的验证规则,你可以对任何类或属性显式指定这些验证规则。
现在让我们来修改Student类,增加一些内建的Required(必须输入),StringLength(输入字符长度)与Range(输入范围)验证规则,当然,我们也可以自定义我们自己的验证规则,之后会说明如何创建自定义验证规则。
&1 //------------------------------------------------------------------------------
&2 // &auto-generated&
&3 // & & 此代码已从模板生成。
&5 // & & 手动更改此文件可能导致应用程序出现意外的行为。
&6 // & & 如果重新生成代码,将覆盖对此文件的手动更改。
&7 // &/auto-generated&
&8 //------------------------------------------------------------------------------
10 namespace Wolfy.FirstMVCProject.Models
12 & & using S
13 & & using System.Collections.G
14 & & ponentModel.DataA
16 & & public partial class Student
18 & & & & public Student()
19 & & & & {
20 & & & & & & this.Score = new HashSet&Score&();
21 & & & & }
23 & & & & public int stuId { }
24 & & & & [Required(ErrorMessage = &必须输入标题&)]
25 & & & & public string stuName { }
27 & & & & public string stuSex { }
28 & & & & public System.DateTime stuBirthdate { }
29 & & & & public System.DateTime stuStudydate { }
30 & & & & [StringLength(4, ErrorMessage = &只能输入4个字符&)]
31 & & & & public string stuAddress { }
32 & & & & [Required(ErrorMessage = &必须输入标题&)]
33 & & & & //正则验证
34 & & & & [RegularExpression(@&^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$&, ErrorMessage = &邮箱格式不正确&)]
35 & & & & public string stuEmail { }
36 & & & & [RegularExpression(@&\d{11}&, ErrorMessage = &邮箱格式不正确&)]
37 & & & & public string stuPhone { }
38 & & & & public Nullable&bool& stuIsDel { }
39 & & & & public Nullable&System.DateTime& stuInputtime { }
40 & & & & public int classId { }
42 & & & & public virtual Course Course { }
43 & & & & public virtual ICollection&Score& Score { }
上述这些验证属性指定了我们想要强加给模型中各属性的验证规则。Required属性表示必须要指定一个属性值,在上例中,一个有效的学生信息必须含有标题,地址,电话,邮箱。Range属性表示属性值必须在一段范围之间。StringLength属性表示一个字符串属性的最大长度或最短长度。
Action中的代码
&1 & & & & [HttpPost]
&2 & & & & public ActionResult Create(Student student)
&3 & & & & {
&4 & & & & & & //ModelState.IsValid校验客户端数据是否全部符合验证规则
&5 & & & & & & if (ModelState.IsValid)
&6 & & & & & & {
&7 & & & & & & & & //获取dropdownlist选中的value值
&8 & & & & & & & & string strClassID = Request.Form[&class&];
&9 & & & & & & & & int intId = Convert.ToInt32(strClassID);
10 & & & & & & & & var course = from c in entity.Course
11 & & & & & & & & & & & & & & &where c.classId == intId
12 & & & & & & & & & & & & & & &
13 & & & & & & & & //处理外键关系
14 & & & & & & & & student.Course = course.FirstOrDefault();
15 & & & & & & & & entity.Student.Add(student);
16 & & & & & & & & entity.SaveChanges();
17 & & & & & & & & return RedirectToAction(&Index&);
19 & & & & & & }
20 & & & & & & else
21 & & & & & & {
22 & & & & & & & & //在不符合验证规则的时候,得重新绑定DropDownList数据源。
23 & & & & & & & & var courses = from s in entity.Course
24 & & & & & & & & & & & & & & &
25 & & & & & & & & List&SelectListItem& items = new List&SelectListItem&();
26 & & & & & & & & foreach (var item in courses)
27 & & & & & & & & {
28 & & & & & & & & & & SelectListItem selectListItem = new SelectListItem() { Text = item.className, Value = item.classId.ToString() };
29 & & & & & & & & & & items.Add(selectListItem);
30 & & & & & & & & }
31 & & & & & & & & ViewData[&class&] =
32 & & & & & & & & return View(student);
33 & & & & & & }
34 & & & & }
自定义验证规则
如果上面的验证规则,不能满足需要,可以自己定义验证规则,首先看一下,Required是如何实现的,咱们就模仿Required来实现一个自己的验证规则。
&1 ponentModel.DataAnnotations
&3 & & // 摘要:&
&4 & & // & & 指定需要数据字段值。
&5 & & [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter, AllowMultiple = false)]
&6 & & public class RequiredAttribute : ValidationAttribute
&8 & & & & // 摘要:&
&9 & & & & // & & 初始化 ponentModel.DataAnnotations.RequiredAttribute 类的新实例。
10 & & & & public RequiredAttribute();
12 & & & & // 摘要:&
13 & & & & // & & 获取或设置一个值,该值指示是否允许空字符串。
14 & & & & //
15 & & & & // 返回结果:&
16 & & & & // & & 如果允许空字符串,则为 true;否则为 false。 默认值为 false。
17 & & & & public bool AllowEmptyStrings { }
19 & & & & // 摘要:&
20 & & & & // & & 检查必填数据字段的值是否不为空。
21 & & & & //
22 & & & & // 参数:&
23 & & & & // & value:
24 & & & & // & & 要验证的数据字段值。
25 & & & & //
26 & & & & // 返回结果:&
27 & & & & // & & 如果验证成功,则为 true;否则为 false。
28 & & & & //
29 & & & & // 异常:&
30 & & & & // & ponentModel.DataAnnotations.ValidationException:
31 & & & & // & & 数据字段值为 null。
32 & & & & public override bool IsValid(object value);
&1 &// 摘要:&
&2 & & // & & 作为所有验证属性的基类。
&4 & & // 异常:&
&5 & & // & ponentModel.DataAnnotations.ValidationException:
&6 & & // & & 在设置非本地化 ponentModel.DataAnnotations.ValidationAttribute.ErrorMessage
&7 & & // & & 属性错误消息的同时,本地化错误消息的 ponentModel.DataAnnotations.ValidationAttribute.ErrorMessageResourceType
&8 & & // & & 和 ponentModel.DataAnnotations.ValidationAttribute.ErrorMessageResourceName
&9 & & // & & 属性也被设置。
10 & & public abstract class ValidationAttribute : Attribute
12 & & & &//其他代码
所以,验证规则特性必须集成ValidationAttribute类,当然也可以继承该类的子类。(注意:对于特性约定以Attribute结尾)。
我们就自定义一个验证类,实现默认值约束规则DefaultsAttribute,而实现最简单的方式就是自定义正则表达式的规则。
定义的验证类的代码如下:
&1 & & public class DefaultsAttribute : RegularExpressionAttribute
&3 & & & & public DefaultsAttribute()
&4 & & & & & & : base(&[mf]&)
&5 & & & & {
&7 & & & & }
&8 & & & & public override string FormatErrorMessage(string name)
&9 & & & & {
10 & & & & & & return &性别只能输入m(男)或者f(女)&;
11 & & & & }
为Student类中的stuSex加上特性。
1 & & & & [Defaults]
2 & & & & public string stuSex { }
然后测试一下,看看实现效果
在Create视图(追加学生信息视图)与Create方法内部是如何实现验证的?
该方法中的ModelState.IsValid属性用来判断是否提交的学生信息数据中包含有任何没有通过数据验证的无效数据。如果存在无效数据,Create方法重新返回追加学生信息视图。如果数据全部有效,则将该条数据保存到中。
我们之前创建的使用支架模板的Create.cshtml视图模板中的代码显示如下,在首次打开追加学生信息视图与数据没有通过验证时,Create方法中返回的视图都是使用的这个视图模板。
& 1 @model Wolfy.FirstMVCProject.Models.Student
& 4 & & Layout =
& 7 &!DOCTYPE html&
& 9 &html&
&10 &head&
&11 & & &meta name=&viewport& content=&width=device-width& /&
&12 & & &title&Create&/title&
&13 &/head&
&14 &body&
&15 & & @using (Html.BeginForm(&Create&,&Student&,FormMethod.Post))&
&17 & & & & @Html.AntiForgeryToken()
&18 & & & &&
&19 & & & & &div class=&form-horizontal&&
&20 & & & & & & &h4&Student&/h4&
&21 & & & & & & &hr /&
&22 & & & & & & @Html.ValidationSummary(true)
&24 & & & & & & &div class=&form-group&&
&25 & & & & & & & & @Html.LabelFor(model =& model.stuName, new { @class = &control-label col-md-2& })
&26 & & & & & & & & &div class=&col-md-10&&
&27 & & & & & & & & & & @Html.EditorFor(model =& model.stuName)
&28 & & & & & & & & & & @Html.ValidationMessageFor(model =& model.stuName)
&29 & & & & & & & & &/div&
&30 & & & & & & &/div&
&32 & & & & & & &div class=&form-group&&
&33 & & & & & & & & @Html.LabelFor(model =& model.stuSex, new { @class = &control-label col-md-2& })
&34 & & & & & & & & &div class=&col-md-10&&
&35 & & & & & & & & & & @Html.EditorFor(model =& model.stuSex)
&36 & & & & & & & & & & @Html.ValidationMessageFor(model =& model.stuSex)
&37 & & & & & & & & &/div&
&38 & & & & & & &/div&
&40 & & & & & & &div class=&form-group&&
&41 & & & & & & & & @Html.LabelFor(model =& model.stuBirthdate, new { @class = &control-label col-md-2& })
&42 & & & & & & & & &div class=&col-md-10&&
&43 & & & & & & & & & & @Html.EditorFor(model =& model.stuBirthdate)
&44 & & & & & & & & & & @Html.ValidationMessageFor(model =& model.stuBirthdate)
&45 & & & & & & & & &/div&
&46 & & & & & & &/div&
&48 & & & & & & &div class=&form-group&&
&49 & & & & & & & & @Html.LabelFor(model =& model.stuStudydate, new { @class = &control-label col-md-2& })
&50 & & & & & & & & &div class=&col-md-10&&
&51 & & & & & & & & & & @Html.EditorFor(model =& model.stuStudydate)
&52 & & & & & & & & & & @Html.ValidationMessageFor(model =& model.stuStudydate)
&53 & & & & & & & & &/div&
&54 & & & & & & &/div&
&56 & & & & & & &div class=&form-group&&
&57 & & & & & & & & @Html.LabelFor(model =& model.stuAddress, new { @class = &control-label col-md-2& })
&58 & & & & & & & & &div class=&col-md-10&&
&59 & & & & & & & & & & @Html.EditorFor(model =& model.stuAddress)
&60 & & & & & & & & & & @Html.ValidationMessageFor(model =& model.stuAddress)
&61 & & & & & & & & &/div&
&62 & & & & & & &/div&
&64 & & & & & & &div class=&form-group&&
&65 & & & & & & & & @Html.LabelFor(model =& model.stuEmail, new { @class = &control-label col-md-2& })
&66 & & & & & & & & &div class=&col-md-10&&
&67 & & & & & & & & & & @Html.EditorFor(model =& model.stuEmail)
&68 & & & & & & & & & & @Html.ValidationMessageFor(model =& model.stuEmail)
&69 & & & & & & & & &/div&
&70 & & & & & & &/div&
&72 & & & & & & &div class=&form-group&&
&73 & & & & & & & & @Html.LabelFor(model =& model.stuPhone, new { @class = &control-label col-md-2& })
&74 & & & & & & & & &div class=&col-md-10&&
&75 & & & & & & & & & & @Html.EditorFor(model =& model.stuPhone)
&76 & & & & & & & & & & @Html.ValidationMessageFor(model =& model.stuPhone)
&77 & & & & & & & & &/div&
&78 & & & & & & &/div&
&80 & & & & & & &div class=&form-group&&
&81 & & & & & & & & @Html.LabelFor(model =& model.stuIsDel, new { @class = &control-label col-md-2& })
&82 & & & & & & & & &div class=&col-md-10&&
&83 & & & & & & & & & & @Html.EditorFor(model =& model.stuIsDel)
&84 & & & & & & & & & & @Html.ValidationMessageFor(model =& model.stuIsDel)
&85 & & & & & & & & &/div&
&86 & & & & & & &/div&
&88 & & & & & & &div class=&form-group&&
&89 & & & & & & & & @Html.LabelFor(model =& model.stuInputtime, new { @class = &control-label col-md-2& })
&90 & & & & & & & & &div class=&col-md-10&&
&91 & & & & & & & & & & @Html.EditorFor(model =& model.stuInputtime)
&92 & & & & & & & & & & @Html.ValidationMessageFor(model =& model.stuInputtime)
&93 & & & & & & & & &/div&
&94 & & & & & & &/div&
&96 & & & & & & &div class=&form-group&&
&97 & & & & & & & & @Html.LabelFor(model =& model.Course.classId, &stuClass&, new { @class = &control-label col-md-2& })
&98 & & & & & & & & &div class=&col-md-10&&
&99 & & & & & & & & & & @Html.DropDownList(&class&, String.Empty)
100 & & & & & & & & & & @Html.ValidationMessageFor(model =& model.classId)
101 & & & & & & & & &/div&
102 & & & & & & &/div&
104 & & & & & & &div class=&form-group&&
105 & & & & & & & & &div class=&col-md-offset-2 col-md-10&&
106 & & & & & & & & & & &input type=&submit& value=&Create& class=&btn btn-default& /&
107 & & & & & & & & &/div&
108 & & & & & & &/div&
109 & & & & &/div&
112 & & &div&
113 & & & & @Html.ActionLink(&Back to List&, &Index&)
114 & & &/div&
115 &/body&
116 &/html&
请注意在这段代码中使用了许多Html.EditorFor帮助器来为Student类的每个属性输出一个输入文本框。在每个Html.EditorFor帮助器之后紧跟着一个Html.ValidationMessageFor帮助器。这两个帮助器将与从控制器传入的模型类的对象实例(在本示例中为Student对象的一个实例)结合起来,自动寻找指定给模型的各个验证属性,然后显示对应的验证错误信息。
这种验证体制的好处是在于控制器和Create视图(追加学生信息视图)事先都即不知道实际指定的验证规则,也不知道将会显示什么验证错误信息。验证规则和错误信息只在Student类中被指定。

我要回帖

更多关于 与戴尔合作协议 的文章

 

随机推荐