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编程——模型的更多相关文章

  1. MVC编程模型

    MVC 编程模型 MVC 是三个 ASP.NET 开发模型之一. MVC 是用于构建 web 应用程序的一种框架,使用 MVC (Model View Controller) 设计: Model(模型 ...

  2. ASP.NET MVC 编程参考

    ASP.NET MVC 编程参考   转载请注明出处:http://surfsky.cnblogs.com MVC    参考 http://msdn.microsoft.com/zh-cn/dd40 ...

  3. ASP.NET MVC数组模型绑定

    在ASP.NET MVC中使用Razor语法可以在视图中方便地展示数组,如果要进行数组模型绑定,会遇到索引断裂问题,如下示例: <input type="text" name ...

  4. MVC 编程模型及其变种

    MVC 编程模型及其变种 MVC全称是Model View Controller, 这是一个模型(model)-查看(view)-调节器(controller)缩写,这是通过通用的编程模型非.MVC当 ...

  5. asp.net MVC 自定义模型绑定 从客户端中检测到有潜在危险的 Request.QueryString 值

    asp.net mvc 自定义模型绑定 有潜在的Requset.Form 自定义了一个模型绑定器.前端会传过来一些敏感字符.调用bindContext. valueProvider.GetValue( ...

  6. ASP.NET MVC编程——视图

    1Razon语法 使用@符号后接C#或VB.NET语句的方式. 基本规则 1)变量 @后直接变量即可 2)代码块 为使用表达式或多行代码,@后跟大括号将多行代码包括在大括号中 3)"+&qu ...

  7. ASP.NET MVC编程——错误处理与日记

    ASP.NET MVC的错误处理应考虑到这几个方面:模型绑定期间发生的错误,未能路由到指定操作,针对控制器的错误处理.使用配置文件可以帮助我们处理异常,但是不够灵活和全面:使用HandleErrorA ...

  8. ASP.NET MVC编程——单元测试

    1自动化测试基本概念 自动化测试分为:单元测试,集成测试,验收测试. 单元测试 检验被测单元的功能,被测单元一般为低级别的组件,如一个类或类方法. 单元测试要满足四个条件:自治的,可重复的,独立的,快 ...

  9. ASP.NET MVC编程——路由

    框架自动生成的路由配置 上图中,路由配置文件为App_Start文件夹下的RouteConfig.cs. 代码如下: public class RouteConfig { public static ...

随机推荐

  1. springmvc报406错误

    springmvc出现406,无非就两种情况,第一,百分之九十是json包没加进来,第二,百分之十,就是@ResponseBody返回的的数据,在请求的URL中不能有  .html的后缀

  2. RTlinux3.2安装

    ( 1 ).前言 2003 年以后, fmslabs 的 RTLinux Free 版本为 3.2Pre ,和以前的 RTLinux 3.1 比较,不再需要必须从 2.4.4 的内核上安装. RTLi ...

  3. RVDS4.0 + JLINK 调试 cortex-A9

    1.RVDS4.0的安装与破解 参看http://blog.csdn.net/cp1300/article/details/7772645这位大神的帖子吧,写的很详细. 2.JLINK驱动的安装 这里 ...

  4. 【mysql】mysql密码设置和更改

    密码设置: 当用户没有设置密码时: 添加密码: mysqladmin -uroot -password ab12 注:因为开始时root没有密码,所以-p旧密码一项就可以省略了. 当用户存在密码时: ...

  5. freemarker中的left_pad和right_pad

    freemarker中的left_pad和right_pad 1.简易说明 (1)left_pad 距左边 (2)right_pad 距右边 (3)当仅仅只有一个参数时,插入的是空白:当有两个参数时, ...

  6. dojo中表格行隐藏出错

    1.错误描述 TypeError:role._by_idx[e.rowIndex].hide is not a function           (54 out of range 3) 2.错误原 ...

  7. IE浏览器兼容的常见问题及解决方案

    常见6个问题及解决方案 1 IE6/IE7对display:inline-block的支持还欠缺 就是我们做导航栏时通常会用到<ul><li>标签去写,在现在一些主流的浏览器中 ...

  8. input输入框

    7.1,置灰和input框去除置灰 $("#key_SettlementCycle").attr("disabled","disabled" ...

  9. 不为人知的scanf

    这是一篇为老谭洗白的文章 前几天,我见有人在群里说,谭浩强那本书不咋样,还不少错误.我就看了看他发出来的错误 #include<stdio.h> int main(){ int a,b; ...

  10. Python Cookbook(第3版)中文版:15.16 不确定编码格式的C字符串

    15.16 不确定编码格式的C字符串¶ 问题¶ 你要在C和Python直接来回转换字符串,但是C中的编码格式并不确定. 例如,可能C中的数据期望是UTF-8,但是并没有强制它必须是. 你想编写代码来以 ...