ASP.NET MVC编程——模型
1 ViewModel
是一种专门提供给View使用的模型,使用ViewModel的理由是实体或领域模型所包含的属性比View使用的多或少,这种情况下实体或领域模型不适合View使用。
2模型绑定
默认模型绑定器
通过DefaultModelBinder解析客户端传来的数据,为控制器的操作参数列表赋值。
显示模型绑定
使用UpdateModel和TryUpdateModel显示绑定模型,不会检验未绑定字段。
使用UpdateModel方法绑定模型时,如果绑定失败就会抛异常,而TryUpdateModel不会。
验证模型绑定成功与否
使用ModelState.IsValid
获取表单数据
为获得表单数据,使用类型为FormCollection的参数作为操作参数。
清空模型绑定状态
使用ModelState.Clear();清空模型绑定状态以后,验证失败的信息就不会显示到视图上,即使在视图中使用@Html.ValidationSummary()方法。
限制默认的绑定规则
使用BindAttribute属性修饰参数或操作。
public class MyModel
{
public string Filed1 { set; get; }
public string Filed2 { set; get; }
} public ActionResult About([Bind(Include = "Filed1")]MyModel mm)
{
//具体代码
} 或
[Bind(Include = "Filed1")]
public ActionResult About(MyModel mm)
{
//具体代码
}
3 模型修饰
在模型属性上使用一些特性,达到修饰模型属性或验证属性的目的
特性名称 |
描述 |
备注 |
StringLength |
设置字符串允许的最大长度 |
|
Required |
标记字段为必填字段 |
|
RegularExpression |
必须满足指定的正则表达式 |
|
Range |
规定数字的范围 |
|
CustomValidation |
自定义验证规则 |
|
DisplayName |
设置字段的显示名称 |
|
Compare |
比较两个字段是否一致 |
可用于确认第二次输入是否与第一次一致 |
MinLength |
设置数组或字符串最小长度 |
|
MaxLength |
设置数组或字符串最大长度 |
|
Remote |
通过控制器操作验证指定字段 |
public RemoteAttribute(string action, string controller); |
例:
1)指定许可的范围
public class ModelF
{
public string Field { get; set; } [Range(typeof(DateTime), "1/1/2018", "1/1/2019")]
public DateTime Field2 { get; set; }
}
2)使用占位符
[StringLength(, ErrorMessage = "{0} 必须至少包含 {2} 个字符。", MinimumLength = )]
public string NewPassword { get; set; }
4扩展
自定义注解
创建自定义特性,继承自ValidationAttribute,ValidationAttribute有两个虚方法,可以通过重载这两个虚方法来完成自定义验证逻辑。
public virtual bool IsValid(object value);
protected virtual ValidationResult IsValid(object value, ValidationContext validationContext);
例:
public class CustomValidationAttribute : ValidationAttribute
{
public CustomValidationAttribute()
: base("{0} 验证失败的缘由")
{ }
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
if (value != null)
{
//验证逻辑 //验证失败,返回错误信息
string errorMessage = FormatErrorMessage(validationContext.DisplayName);
return new ValidationResult(errorMessage); }
return ValidationResult.Success;
}
}
5 原理
传入操作的数据存在于HTTP请求的请求URL,消息头,消息体。当操作带有参数时,MVC框架使用模型绑定器(默认的或自定义的)在Http请求中查找数据,用于构建控制器操作的参数列表。
验证发生的时间
模型验证是在操作执行之前完成的。当模型绑定器使用新值对模型属性更新后,会利用当前模型元数据获得模型验证器,模型验证器会找到所有施加于模型属性的特性并执行验证逻辑,然后模型绑定器会捕获所有失败的验证规则,并将它们放入模型状态中。
模型状态
模型状态包含了模型绑定期间绑定的值,和模型绑定期间发生的任何错误。
参考:
1.Jess Chadwick/Todd Snyder/Hrusikesh Panda,徐雷/徐扬
译。ASP.NET MVC4 Web编程
2.Jon Galloway/Phil Haack/Brad Wilson/K. Scott Allen,孙远帅/邹权译 ASP.NET MVC4 高级编程(第四版)
3.黄保翕,ASP.NET MVC4开发指南
4.蒋金楠,ASP.NET MVC4框架揭秘
5.https://www.asp.net/mvc
转载与引用请注明出处。 时间仓促,水平有限,如有不当之处,欢迎指正。
ASP.NET MVC编程——模型的更多相关文章
- MVC编程模型
MVC 编程模型 MVC 是三个 ASP.NET 开发模型之一. MVC 是用于构建 web 应用程序的一种框架,使用 MVC (Model View Controller) 设计: Model(模型 ...
- ASP.NET MVC 编程参考
ASP.NET MVC 编程参考 转载请注明出处:http://surfsky.cnblogs.com MVC 参考 http://msdn.microsoft.com/zh-cn/dd40 ...
- ASP.NET MVC数组模型绑定
在ASP.NET MVC中使用Razor语法可以在视图中方便地展示数组,如果要进行数组模型绑定,会遇到索引断裂问题,如下示例: <input type="text" name ...
- MVC 编程模型及其变种
MVC 编程模型及其变种 MVC全称是Model View Controller, 这是一个模型(model)-查看(view)-调节器(controller)缩写,这是通过通用的编程模型非.MVC当 ...
- asp.net MVC 自定义模型绑定 从客户端中检测到有潜在危险的 Request.QueryString 值
asp.net mvc 自定义模型绑定 有潜在的Requset.Form 自定义了一个模型绑定器.前端会传过来一些敏感字符.调用bindContext. valueProvider.GetValue( ...
- ASP.NET MVC编程——视图
1Razon语法 使用@符号后接C#或VB.NET语句的方式. 基本规则 1)变量 @后直接变量即可 2)代码块 为使用表达式或多行代码,@后跟大括号将多行代码包括在大括号中 3)"+&qu ...
- ASP.NET MVC编程——错误处理与日记
ASP.NET MVC的错误处理应考虑到这几个方面:模型绑定期间发生的错误,未能路由到指定操作,针对控制器的错误处理.使用配置文件可以帮助我们处理异常,但是不够灵活和全面:使用HandleErrorA ...
- ASP.NET MVC编程——单元测试
1自动化测试基本概念 自动化测试分为:单元测试,集成测试,验收测试. 单元测试 检验被测单元的功能,被测单元一般为低级别的组件,如一个类或类方法. 单元测试要满足四个条件:自治的,可重复的,独立的,快 ...
- ASP.NET MVC编程——路由
框架自动生成的路由配置 上图中,路由配置文件为App_Start文件夹下的RouteConfig.cs. 代码如下: public class RouteConfig { public static ...
随机推荐
- JDBC各种数据库连接方式
1)连接Oracle 8/8i/9i/10g/11g(thin模式) Class.forName("oracle.JDBC.driver.OracleDriver").newIns ...
- 网络基础Cisco路由交换一
VLAN概述 Virtual LAN(虚拟局域网)是物理设备上链接的不受物理位置限制的用户的一个逻辑组,. 引用VLAN: 交换机分割了冲突域,但是不能分割广播域,随着交换机端口数量的增多,网络中广播 ...
- probabilistic robotics_bayes filter
贝叶斯滤波 执行测量后的后验概率: 执行测量前的先验概率: 执行测量后的后验概率推导 根据式2.23的推导方式 可推出 假定xt是complete,即xt可以完全决定测量结果,那么则有2.56式: 带 ...
- NLP+词法系列(一)︱中文分词技术小结、几大分词引擎的介绍与比较
笔者想说:觉得英文与中文分词有很大的区别,毕竟中文的表达方式跟英语有很大区别,而且语言组合形式丰富,如果把国外的内容强行搬过来用,不一样是最好的.所以这边看到有几家大牛都在中文分词以及NLP上越走越远 ...
- Android(Java)利用findbugs进行代码静态检查
主要介绍利用java静态代码检查工具findbugs进行代码检查,包括其作用.安装.使用.高级功能(远程review和bug同步). 虽然Android提供了Test Project工程以及instr ...
- GitHub上最火的Android开源项目整理
这篇文章介绍GitHub上另外34个非常受欢迎的Android开源项目,在这些项目中,你又在用或用过哪些呢? 41. android-swipelistview SwipeListView是一个And ...
- vc++怎么可以直接刷掉MBR?搞笑的吧
FILE * fd=fopen("\\\\.\\PHYSICALDRIVE0","rb+"); char buffer[512]; fread(buffer,5 ...
- freemarker报错之十一
1.错误描述 六月 03, 2014 11:00:35 下午 freemarker.log.JDK14LoggerFactory$JDK14Logger error 严重: Template proc ...
- SecurityError:Error:#2148
1.错误描述 SecurityError:Error:#2148:SWF文件http://localhost:8888/UploadDownload/Flash/ReadLocalFile.swf/[ ...
- eclipse -解决Unhandled event loop exception GC overhead limit exceeded
今天第一次遇到这个问题, 拿出来和大家分享一下. 首先说明下我发现这个错误的过程, 看下面的三张图片 1,在本地weblogic发布项目的时候 2 , 等待一段时间, 出现以下错误 3 , 点击上 ...