问题1:View层如何向Controller的Action传递Model数据?
在View中,可以使用Form表单进行模型数据的提交,同样的,我们需要关联提交数据的类型,则需要在View中使用@model + 数据类型
不同的是,此时Model属性为null,而且Model是一个只读属性,我们不能使用它来存储数据,此时应该使用形式参数来接收客户端填写的值。
形式参数的名称可以自己定义,其类型已经是明确的了,就是我们上变关联的数据类型。例子:上一篇文章的Person类
@model MVCTest.Models.Person

@{
    ViewBag.Title = "Create";
}
<h2>Create</h2>

@using (Html.BeginForm()) {
    @Html.AntiForgeryToken()
    @Html.ValidationSummary(true)

<fieldset>
        <legend>Person</legend>

<div class="editor-label">
            @Html.LabelFor(aa => aa.IdCard)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.IdCard)
            @Html.ValidationMessageFor(model => model.IdCard)
        </div>

<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.Sex)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Sex)
            @Html.ValidationMessageFor(model => model.Sex)
        </div>

<div class="editor-label">
            @Html.LabelFor(model => model.Age)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Age)
            @Html.ValidationMessageFor(model => model.Age)
        </div>

<p>
            <input type="submit" value="Create" />
        </p>
    </fieldset>
}
HtmlHelper类的使用将在以后作详细介绍,此处不做重点关注。注意点:有时候在进行传值的时候,需要考虑形参与实参名字的一致性(大小写忽略不计)

此处需要明确的一点是:submit是直接将数据提交到与该视图同名的Action中,所以在对应的控制器中,该Action方法可能会有重载的方式。

此外,除了form表单之外,我们也可以使用HtmlHelper类中的@HTML.ActionLink(string LinkText,string ActionName,object parameter)的形式向
本控制器下的ActionName提交object 类型的parameter,采用这种方式的时候,需要在View中添加@using + Model所在命名空间,并且需要定义出该类的实例,

问题2:如何使用Model层的数据验证?
MVC为我们提供了基于特性的数据验证,这些验证特性全部位于System.ComponentModel.DataAnnotations命名空间下且继承自ValidationAttribute基类
这也说明了,如果我们需要自定义验证特性,则需要继承自该类或该类的子类,关于自定义验证特性,后边再作介绍。
先为我们的Person类添加一些验证特性,代码如下:
  public class Person
    {
        [DisplayName("编号")]
        [Required(ErrorMessage="编号不能为空")]
        [RegularExpression("00\\d*",ErrorMessage="编号必须以00开始")]
        public string IdCard { get; set; }

[DisplayName("姓名")]
        [Required]
        [StringLength(3,ErrorMessage="姓名最多为3个汉字")]
        public string Name { get; set; }

[DisplayName("性别")]
        [RegularExpression("男|女",ErrorMessage="性别错误!男/女")]
        public string Sex { get; set; }

[DisplayName("年龄")]
        [Range(0,150,ErrorMessage="年龄应在0-150岁之间")]
        public int Age { get; set; }
    }
   然后 在客户端(View层)进行验证,需要通过下面步骤:
    第一步:配置web.config,开启javascript客户端验证
    <appSettings>
     <add key="ClientValidationEnabled" value="true"/>
     <add key="UnobtrusiveJavaScriptEnabled" value="true"/>
    </appSettings>
    第二步:在需要验证的视图中引进两个js:
    <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>
    这样做了之后运行,会报错:在我们引进的两个js文件中Jquery没有定义,这是因为没有引进Jquery.js文件且该文件必须第一个被引用
    在两个js脚本之前再添加一个引用:
    <script src="@Url.Content("~/Scripts/jquery-1.8.2.js")" type="text/javascript"></script>
    添加完后再运行,就不会报错了。

运行之后的效果是这样的:

红色字体可以自己添加和<font>标签进行实现

到这里,我们知道了View想Action传值的方式,也知道了可以实例Model层的数据验证的客户端完成一些验证,但是,Model层的验证方式有哪些?使用的时候需要注意什么,这些将在下一篇中介绍

Model层数据验证的更多相关文章

  1. MetadataType的使用,MVC的Model层数据验证

    MetadataType的使用,MVC的Model层数据验证 指定要与数据模型类关联的元数据类   using System.ComponentModel.DataAnnotations; //指定要 ...

  2. 【转】METADATATYPE的使用,MVC的MODEL层数据验证

    http://www.cnblogs.com/chshnan/archive/2011/07/08/2100713.html MetadataType的使用,MVC的Model层数据验证指定要与数据模 ...

  3. MVC进阶篇(三)——model层数据验证

    前言 常常在想,姓名性别那些个验证,真的有必要每次遇到,每次写验证吗?好麻烦,于是学到MVC这里,发现MVC自带数据验证,这个东西着实是个好东西.我写了一个小demo,分享给大家. 内容 一个表单的提 ...

  4. ASP.NET MVC中对Model进行分步验证的解决方法

    原文:ASP.NET MVC中对Model进行分步验证的解决方法 在我之前的文章:ASP.NET MVC2.0结合WF4.0实现用户多步注册流程中将一个用户的注册分成了四步,而这四个步骤都是在完善一个 ...

  5. ASP.NET MVC基于标注特性的Model验证:一个Model,多种验证规则

    原文:ASP.NET MVC基于标注特性的Model验证:一个Model,多种验证规则 对于Model验证,理想的设计应该是场景驱动的,而不是Model(类型)驱动的,也就是对于同一个Model对象, ...

  6. Model Validation(模型验证)

    Model Validation(模型验证) 前言 阅读本文之前,您也可以到Asp.Net Web API 2 系列导航进行查看 http://www.cnblogs.com/aehyok/p/344 ...

  7. 第十节:数据批注(DataAnnotationModel)和自定义验证(包括Model级别的验证)

    一. 简介 写完上一个章节MVC中的常用特性,迫不及待将该系列补全,该章节主要介绍数据批注(也叫:注解). 一听[数据批注],好高大上的名字,但仔细一看,它们其实是[System.ComponentM ...

  8. 10、ASP.NET MVC入门到精通——Model(模型)和验证

    本系列目录:ASP.NET MVC4入门到精通系列目录汇总 模型就是处理业务,想要保存.创建.更新.删除的对象. 注解(通过特性实现) DisplayName Required StringLengt ...

  9. sencha touch Model validations 自定义验证 二选一输入验证、重复验证、时间验证、比较验证、条件验证(2015-1-14)

    项目初始化时执行以下代码 //重写模型,方便进行自定义验证 Ext.define("Ext.zh.data.Model", { override: "Ext.data.M ...

随机推荐

  1. 洛谷P3374 【模板】树状数组 1

    P3374 [模板]树状数组 1 140通过 232提交 题目提供者HansBug 标签 难度普及/提高- 提交  讨论  题解 最新讨论 题目描述有误 题目描述 如题,已知一个数列,你需要进行下面两 ...

  2. No.016 3Sum Closest

    16. 3Sum Closest Total Accepted: 86565 Total Submissions: 291260 Difficulty: Medium Given an array S ...

  3. leetcode 141

    141. Linked List Cycle Given a linked list, determine if it has a cycle in it. Follow up:Can you sol ...

  4. Bootstrap 更改Navbar默认样式

    alt+shift+n 新建文件ctrl+shift+/ 注释ctrl+shift+f 重新排版代码ctrl+/ 注释 /* navbar */.navbar-default { background ...

  5. python 排序

    python 写的排序,实现起来还是比较简单 #快速排序 def qsort(L): if len(L)>1: return qsort([i for i in L[1:] if i<L[ ...

  6. php 文件读取

    整理了一下PHP中读取文件的几个方法,方便以后查阅. 1.fread string fread ( int $handle , int $length ) fread() 从 handle 指向的文件 ...

  7. DIOCP网络通讯流程

    DIOCP 运作核心探密   原文连接: http://blog.qdac.cc/?p=2362 原作者: BB 天地弦的DIOCP早已经广为人知了,有很多的同学都用上了它,甚至各种变异.修改版本也出 ...

  8. springMVC + Spring + MyBatis 整合

    整理下SSM(基于注解)的整合 1. web.xml 配置文件 <?xml version="1.0" encoding="UTF-8"?> < ...

  9. LeetCode:Longest Palindromic Substring 最长回文子串

    题目链接 Given a string S, find the longest palindromic substring in S. You may assume that the maximum ...

  10. 开发中用到的开源框架汇总(Updating)

    SuperWebSocket SuperSocket NPOI 官网:http://npoi.codeplex.com/ 实例讲解:http://www.cnblogs.com/yutian/p/52 ...