返璞归真 asp.net mvc (8) - asp.net mvc 3.0 新特性之 Model

时间:2023-02-25 15:37:58

原文:返璞归真 asp.net mvc (8) - asp.net mvc 3.0 新特性之 Model

[索引页]
[源码下载]

返璞归真 asp.net mvc (8) - asp.net mvc 3.0 新特性之 Model

作者:webabcd

介绍
asp.net mvc 之 asp.net mvc 3.0 新特性之 Model:

  • 通过 Data Annotations 与 jQuery 的结合实现服务端和客户端的双重验证
  • 双重验证中,使客户端实现远程的异步验证
  • 自定义 Data Annotations 与 jQuery,以实现自定义的双重验证

示例
1、Model 中通过 Data Annotations 与 jQuery 的结合实现服务端和客户端的双重验证
Web.config

<configuration>
<!--
要实现服务端和客户端的双重验证,需要做如下配置,因为双重验证中的客户端验证需要依赖此配置
-->
<appSettings>
<add key="ClientValidationEnabled" value="true"/>
<add key="UnobtrusiveJavaScriptEnabled" value="true"/>
</appSettings>
</configuration>

User.cs

/*
* 在 asp.net mvc 3.0 中支持通过 Data Annotations 来实现服务端和客户端的双重验证,需要 jQuery 的支持
* 所有 Data Annotations 相关的 Attribute 直接用类视图看 System.ComponentModel.DataAnnotations 就行了,详细说明以前写过好多遍了,这里就不重复了
* 另外 System.Web.Mvc 下有一些新增的 Data Annotations
*/ using System;
using System.Collections.Generic;
using System.Linq;
using System.Web; using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Web.Mvc; namespace MVC30.Models
{
public class User
{
public int ID { get; set; } [DisplayName("名字")]
[Required(ErrorMessage = "名字不能为空")]
public string Name { get; set; } [DisplayName("密码")]
[Required(ErrorMessage = "密码不能为空")]
public string Password { get; set; } [DisplayName("确认密码")]
[Required(ErrorMessage = "确认密码不能为空")]
[Compare("Password", ErrorMessage="两次密码输入不一致")]
public string ConfirmPassword { get; set; } public DateTime DateOfBirth { get; set; } // 请求时,允许此字段包含 HTML 标记
[AllowHtml]
public string Comment { get; set; }
}
}

ValidationDemoController.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc; using MVC30.Models; namespace MVC30.Controllers
{
public class ValidationDemoController : Controller
{
// 用于演示通过 Data Annotations 实现服务端和客户端的双重验证
public ActionResult Validation_DataAnnotations()
{
var user = new User { ID = , Name = "webabcd", DateOfBirth = new DateTime(, , ), Comment = "<b>mvp</b>" }; return View(new User());
} [HttpPost]
public ActionResult Validation_DataAnnotations(User user)
{
return View(user);
}
}
}

Validation_DataAnnotations.cshtml

@model MVC30.Models.User

@{
ViewBag.Title = "Validation_DataAnnotations";
} <h2>ClientValidation</h2> <!--
通过 jQuery 实现客户端验证的逻辑,需要引用此 js
-->
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<!--
服务端验证与客户端验证的一一对应需要引用此 js
-->
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script> @*
在 MVC3 中实现客户端验证,不需要添加以下代码
@{ Html.EnableClientValidation(); }
*@ @using (Html.BeginForm())
{
<fieldset>
<legend>User</legend>
<div class="editor-label">
@Html.LabelFor(model => model.Name)
(测试方法:空着文本框,然后提交)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Name)
@Html.ValidationMessageFor(model => model.Name)
</div>
<p>
<input type="submit" value="Create" />
</p>
</fieldset>
}

2、Model 中通过 Data Annotations 与 jQuery 的结合实现服务端和客户端的双重验证,其中客户端可以实现远程的异步验证
User.cs

/*
* System.Web.Mvc.Remote(string action, string controller) - 让客户端可以通过 ajax 的方式远程验证
* action - 实现验证逻辑的 action,即处理客户端的异步请求的 action
* controller - 实现验证逻辑的 controller,即处理客户端的异步请求的 controller
*/ using System;
using System.Collections.Generic;
using System.Linq;
using System.Web; using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Web.Mvc; namespace MVC30.Models
{
public class User
{
public int ID { get; set; } [DisplayName("名字")]
[Required(ErrorMessage = "名字不能为空")]
[Remote("CheckUserNameExists", "ValidationDemo", ErrorMessage = "名字已存在")]
public string Name { get; set; } [DisplayName("密码")]
[Required(ErrorMessage = "密码不能为空")]
public string Password { get; set; } [DisplayName("确认密码")]
[Required(ErrorMessage = "确认密码不能为空")]
[Compare("Password", ErrorMessage="两次密码输入不一致")]
public string ConfirmPassword { get; set; } public DateTime DateOfBirth { get; set; } // 请求时,允许此字段包含 HTML 标记
[AllowHtml]
public string Comment { get; set; }
}
}

ValidationDemoController.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc; using MVC30.Models; namespace MVC30.Controllers
{
public class ValidationDemoController : Controller
{
// 用于演示客户端的远程 ajax 异步验证
public ActionResult Validation_Remote()
{
var user = new User { ID = , Name = "webabcd", DateOfBirth = new DateTime(, , ), Comment = "<b>mvp</b>" }; return View(new User());
} [HttpPost]
public ActionResult Validation_Remote(User user)
{
return View(user);
} // 用于处理客户端的异步请求,测试时请使用字符串“webabcd”
[HttpGet]
public ActionResult CheckUserNameExists(string name)
{
return Json(name != "webabcd", JsonRequestBehavior.AllowGet);
}
}
}

Validation_Remote.cshtml

@model MVC30.Models.User

@{
ViewBag.Title = "Validation_Remote";
} <h2>ClientValidation</h2> <script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script> @using (Html.BeginForm())
{
<fieldset>
<legend>User</legend>
<div class="editor-label">
@Html.LabelFor(model => model.Name)
(测试方法:在文本框中输入“webabcd”)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Name)
@Html.ValidationMessageFor(model => model.Name)
</div>
<p>
<input type="submit" value="Create" />
</p>
</fieldset>
}

3、Model 中使用更多的 Data Annotations 以及实现自定义的 Data Annotations 和自定义 jQuery 的相关逻辑
User.cs

/*
* 如何使用更多的 Data Annotation
* 1、在“Tools”中选择“Extension Manager”(安装 NuGet 后会有此选项)
* 2、搜索“DataAnnotationsExtensions”,然后安装“DataAnnotationsExtensions.MVC3”项目
* 3、之后就可以使用此项目所支持的多个新的 Data Annotation
* 如何自定义 Data Annotation
* 详见:IntegerAttribute.cs
*/ using System;
using System.Collections.Generic;
using System.Linq;
using System.Web; using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Web.Mvc; namespace MVC30.Models
{
public class User
{
public int ID { get; set; } [DisplayName("名字")]
[Required(ErrorMessage = "名字不能为空")]
[Remote("CheckUserNameExists", "ValidationDemo", ErrorMessage = "名字已存在")]
public string Name { get; set; } [DisplayName("密码")]
[Required(ErrorMessage = "密码不能为空")]
[Integer(ErrorMessage = "密码必须是整型")]
public string Password { get; set; } [DisplayName("确认密码")]
[Required(ErrorMessage = "确认密码不能为空")]
[Compare("Password", ErrorMessage="两次密码输入不一致")]
public string ConfirmPassword { get; set; } public DateTime DateOfBirth { get; set; } // 请求时,允许此字段包含 HTML 标记
[AllowHtml]
public string Comment { get; set; }
}
}

IntegerAttribute.cs

/*
* 自定义 Data Annotation,以实现与 jQuery 结合的客户端和服务端双重验证
*/ using System;
using System.Collections.Generic;
using System.Linq;
using System.Web; using System.ComponentModel.DataAnnotations;
using System.Text.RegularExpressions;
using System.Web.Mvc; namespace MVC30.Models
{
// 继承 ValidationAttribute 抽象类,重写 IsValid() 方法,以实现服务端验证
// 实现 IClientValidatable 接口的 GetClientValidationRules() 方法,以实现客户端验证
public class IntegerAttribute : ValidationAttribute, IClientValidatable
{
// 服务端验证逻辑,判断输入是否为整型
public override bool IsValid(object value)
{
var number = Convert.ToString(value);
return Regex.IsMatch(number, @"^[0-9]+$");
} // 客户端验证逻辑,需要结合客户端验证代码,详见 Validation_Custom.cshtml 文件
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
var rule = new ModelClientValidationRule
{
ErrorMessage = this.ErrorMessage, // ValidationType - 指定一个 key(字符串),该 key 用于关联服务端验证逻辑与客户端验证逻辑。注:这个 key 必须都是由小写字母组成
ValidationType = "isinteger"
}; // 向客户端验证代码传递参数
rule.ValidationParameters.Add("param1", "value1");
rule.ValidationParameters.Add("param2", "value2"); yield return rule;
}
}
}

ValidationDemoController.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc; using MVC30.Models; namespace MVC30.Controllers
{
public class ValidationDemoController : Controller
{
// 用于演示如何使用更多的 Data Annotations 来实现服务端和客户端的双重验证,以及如何自定义 Data Annotations 来实现服务端和客户端的双重验证
public ActionResult Validation_Custom()
{
var user = new User { ID = , Name = "webabcd", DateOfBirth = new DateTime(, , ), Comment = "<b>mvp</b>" }; return View(new User());
} [HttpPost]
public ActionResult Validation_Custom(User user)
{
return View(user);
}
}
}

Validation_Custom.cshtml

@model MVC30.Models.User

@{
ViewBag.Title = "ClientValidation";
} <h2>ClientValidation</h2> <script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script> <script type="text/javascript"> // 客户端验证逻辑,判断输入是否为整型
jQuery.validator.addMethod(
'checkInteger',
function (value, element) {
var reg = new RegExp("^[0-9]+$");
return (reg.test(value));
}
); // 将客户端验证逻辑通过 ValidationType 与服务端的相关验证逻辑结合起来
jQuery.validator.unobtrusive.adapters.add(
'isinteger', // ValidationType,必须全为小写
['param1', 'param2'], // 接收 ModelClientValidationRule 中的参数信息
function (options) {
options.rules['checkInteger'] = true; // 启用名为 checkInteger 的客户端验证逻辑
options.messages['checkInteger'] = options.message; // 发生验证错误后的显示信息
var param1 = options.params.param1; // ModelClientValidationRule 中的参数信息
var param2 = options.params.param2; // ModelClientValidationRule 中的参数信息
alert(param1 + " " + param2);
}
); </script> @using (Html.BeginForm())
{
<fieldset>
<legend>User</legend>
<div class="editor-label">
@Html.LabelFor(model => model.Name)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Name)
@Html.ValidationMessageFor(model => model.Name)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.Password)
(测试方法:在文本框中输入非整型的字符串)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Password)
@Html.ValidationMessageFor(model => model.Password)
</div>
<p>
<input type="submit" value="Create" />
</p>
</fieldset>
}

OK
[源码下载]

返璞归真 asp.net mvc (8) - asp.net mvc 3.0 新特性之 Model的更多相关文章

  1. 返璞归真 asp&period;net mvc &lpar;13&rpar; - asp&period;net mvc 5&period;0 新特性

    [索引页][源码下载] 返璞归真 asp.net mvc (13) - asp.net mvc 5.0 新特性 作者:webabcd 介绍asp.net mvc 之 asp.net mvc 5.0 新 ...

  2. 返璞归真 asp&period;net mvc &lpar;7&rpar; - asp&period;net mvc 3&period;0 新特性之 Controller

    原文:返璞归真 asp.net mvc (7) - asp.net mvc 3.0 新特性之 Controller [索引页][源码下载] 返璞归真 asp.net mvc (7) - asp.net ...

  3. 返璞归真 asp&period;net mvc &lpar;12&rpar; - asp&period;net mvc 4&period;0 新特性之移动特性

    原文:返璞归真 asp.net mvc (12) - asp.net mvc 4.0 新特性之移动特性 [索引页][源码下载] 返璞归真 asp.net mvc (12) - asp.net mvc ...

  4. 返璞归真 asp&period;net mvc &lpar;11&rpar; - asp&period;net mvc 4&period;0 新特性之自宿主 Web API&comma; 在 WebForm 中提供 Web API&comma; 通过 Web API 上传文件&comma; &period;net 4&period;5 带来的更方便的异步操作

    原文:返璞归真 asp.net mvc (11) - asp.net mvc 4.0 新特性之自宿主 Web API, 在 WebForm 中提供 Web API, 通过 Web API 上传文件, ...

  5. 返璞归真 asp&period;net mvc &lpar;9&rpar; - asp&period;net mvc 3&period;0 新特性之 View&lpar;Razor&rpar;

    原文:返璞归真 asp.net mvc (9) - asp.net mvc 3.0 新特性之 View(Razor) [索引页][源码下载] 返璞归真 asp.net mvc (9) - asp.ne ...

  6. 返璞归真 asp&period;net mvc &lpar;10&rpar; - asp&period;net mvc 4&period;0 新特性之 Web API

    原文:返璞归真 asp.net mvc (10) - asp.net mvc 4.0 新特性之 Web API [索引页][源码下载] 返璞归真 asp.net mvc (10) - asp.net ...

  7. 返璞归真 asp&period;net mvc &lpar;6&rpar; - asp&period;net mvc 2&period;0 新特性

    原文:返璞归真 asp.net mvc (6) - asp.net mvc 2.0 新特性 [索引页][源码下载] 返璞归真 asp.net mvc (6) - asp.net mvc 2.0 新特性 ...

  8. asp&period;net mvc 4&period;0 新特性之移动特性

    asp.net mvc 4.0 新特性之移动特性 为不同的客户端提供不同的视图 手动重写 UserAgent,从而强制使用对应的视图 示例1.演示如何为不同的客户端提供不同的视图Global.asax ...

  9. ASP&period;NET4&period;0新特性

    原文:ASP.NET4.0新特性 在以前试用VS2010的时候已经关注到它在Web开发支持上的一些变化了,为此我还专门做了一个ppt,当初是计划在4月12日那天讲的,结果因为莫名其妙的原因导致没有语音 ...

随机推荐

  1. STSdb,最强纯C&num;开源NoSQL和虚拟文件系统 4&period;0 RC2 支持C&sol;S架构

    STSdb是什么 再来说明一下STSdb是什么:STSdb是C#写的开源嵌入式数据库和虚拟文件系统,支持实时索引,性能是同类产品的几倍到几十倍,访问官方网站. 温故知新 之前发了文章<STSdb ...

  2. Android图片压缩方法总结

    本文总结Android应用开发中三种常见的图片压缩方法,分别是:质量压缩法.比例压缩法(根据路径获取图片并压缩)和比例压缩法(根据Bitmap图片压缩).   第一:质量压缩方法:   ? 1 2 3 ...

  3. tigerVNC远程桌面,跨内网

    tigerVNC的简单使用教程(CentOS的远程桌面连接) 1.环境和软件准备 (1) CentOS 6.5下 [root@localhost ~]$ yum install tigervnc (2 ...

  4. 关于解决Tomcat服务器Connection reset by peer 导致的宕机

    org.apache.catalina.connector.ClientAbortException: java.io.IOException: Connection reset by peer at ...

  5. &lbrack;转&rsqb;ConcurrentHashMap原理分析

    一.背景: 线程不安全的HashMap     因为多线程环境下,使用Hashmap进行put操作会引起死循环,导致CPU利用率接近100%,所以在并发情况下不能使用HashMap. 效率低下的Has ...

  6. 电商系统架构总结1(EF)

    最近主导了一个电商系统的设计开发过程,包括前期分析设计,框架搭建,功能模块的具体开发(主要负责在线支付部分),成功上线后的部署维护,运维策略等等全过程. 虽然这个系统不是什么超大型的电商系统 数亿计的 ...

  7. JavaScript 之arguments、caller 和 callee 介绍

    1.前言 arguments, caller ,   callee 是什么? 在javascript 中有什么样的作用?本篇会对于此做一些基本介绍. 2. arguments arguments:  ...

  8. NSThread 在主线操作的三个方法

    - (void)createNSThread444{ UIImage *image = [UIImage imageNamed:@"图片名字"]; /** 1 performSel ...

  9. 几种封装javaBean的方法

    开发框架时,经常需要使用java对象(javaBean)的属性来封装程序的数据,封装javaBean的方法有很多,比如反射,内省,以及使用工具类.下面从反射开始介绍. 1.javaBean介绍: 简介 ...

  10. C语言回调函数总结

    /* Main program ---calls--> Library function ---calls--> Callback funtion */ #include <stdi ...