问题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层的验证方式有哪些?使用的时候需要注意什么,这些将在下一篇中介绍