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(100, ErrorMessage = "{0} 必须至少包含 {2} 个字符。", MinimumLength = 6)]
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

-----------------------------------------------------------------------------------------

转载与引用请注明出处。

时间仓促,水平有限,如有不当之处,欢迎指正。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏决胜机器学习

有趣的算法(四)——一致性Hash算法模拟redis集群

有趣的算法(四)——一致性Hash算法模拟redis集群 (原创内容,转载请注明来源,谢谢) 一、概述 redis的集群,对key存储在哪个服务器的问题上,采...

3307
来自专栏人人都是极客

环形缓冲区的实现

队列 (Queue):是一种先进先出(First In First Out ,简称 FIFO)的线性表,只允许在一端插入(入队),在另一端进行删除(出队)。

2213
来自专栏SDNLAB

码农学ODL之Toaster代码解析

Toaster(烤面包机)是OpenDaylight的一个例子,该例子的目的不是让你如何烤面包,而是借这个例子学习OpenDaylight的特性。在Toaste...

3966
来自专栏YG小书屋

MapReduce:N keys,N files(三)数据倾斜优化

还是如何将N个keys写到N个文件的需求。 这次的问题是单个key太大,引起的单个reduce任务执行时间过长,导致整个MR运行时间过长。数据大部分的key在...

832
来自专栏机器学习从入门到成神

Pandas使用DataFrame进行数据分析比赛进阶之路(二):日期数据处理:按日期筛选、显示及统计数据

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_35512245/articl...

5771
来自专栏技术碎碎念

处理机进程调度模拟

一、进程调度 无论是在批处理还是分时系统中,用户进程数一般都多于处理机数、这将导致它们互相争夺处理机。另外,系统进程也同样需要使用处理机。这就要求进程调度程序按...

39811
来自专栏深度学习那些事儿

提升python项目完成效率的调试方法技巧(上)

效率提升是极为重要的事情,我们的时间本来就不充裕,不应该过多将时间浪费在调试过程中。对于大型项目光有dubug是不够的,如果需要提高产品调试进度,必须需要采取一...

3817
来自专栏idba

性能优化之Block Nested-Loop Join(BNL)

相信许多开发/DBA在使用MySQL的过程中,对于MySQL处理多表关联的方式或者说性能一直不太满意。对于开发提交的含有join的查询,一般比较抗拒,从而建议将...

1301
来自专栏大数据挖掘DT机器学习

文本分类中语料库的获取——搜狗语料库

这次主要总结搜过语料库的获取,因为老师要求20万数据,而我自己只爬了2万多,所以用到了搜狗的语料库. ? 在这个页面中,我选择的是一个月的数据,别小看一个月...

6628
来自专栏linux驱动个人学习

高通 display 驱动【转】

1.4K4

扫码关注云+社区