• 处理表单

前面的列子我们已经把表单提交给了HomeControllers类中的RsvpForm动作方法,只是在这个动作方法内,我们并没有做什么具体的逻辑处理,而是直接返回一个

“Thanks”的视图。
 return View("Thanks", studentResponse);
这个View方法的调用告诉MVC,查找并渲染一个名为“Thanks”的视图,并把studentResponse对象传递给视图。现在项目中还没有这个视图,这里创建Thanks视图,怎么创建就不用再说了。如下所示
Thanks视图的代码如下
@model PartyInvites.Models.StudentResponse

@{
Layout = null;
} <html>
<head>
<title>Thanks</title>
</head>
<body>
<p>谢谢您!,@Model.Name!</p>
@if (Model.HavingGet==true)
{
@:很高心您已经收到了录取通知书!
}
else
{
@:不好意思!您还没有收到录取通知书!我们会尽快核对,并通知您!
}
</body>
</html>
这里的Thanks视图使用Razor来显示基于StudentResponse属性的内容,这是我们在RsvpForm动作方法中传递给视图的。Razor的@model操作符指示了这个强类型视图的域模型类型。为了访问这个域对象中某个属性的值,我们使用Model.<属性名>。列如获得Name属性的值,调用Model.Name。这里对Razor语法大家肯定会不熟悉,后面我们在来慢慢研究它。
至此我们可以运行这个程序来看一下结果
  • 添加验证

现在,到了把验证添加到应用程序的时候了。如果不做这件事,用户可能会出入无意义的数据,甚至递交一个空白表单。

在MVC应用程序中,验证被典型地运用于域(模型,MVC中M)模型,而不是在用户界面上。这意味着,在一个地方定义验证条件,会在任何运用模型类的地方生效。ASP.NET MVC支持验证规则声明,验证规则是以System.ComponentModel.DataAnnotations命名空间中的注解属性进行定义的。下面演示了如何把注解的属性运用于StudentResponse模型类。

using System.ComponentModel.DataAnnotations;
namespace PartyInvites.Models
{
public class StudentResponse
{
[Required(ErrorMessage = "请输入您的姓名!")]
public string Name { get; set; }
[Required(ErrorMessage = "请输入您的手机号码!")]
public string Mobile { get; set; }
[Required(ErrorMessage = "请输入您的邮箱!")]
[RegularExpression(".+\\@.+\\..+", ErrorMessage = "邮箱格式不正确!")]
public string Email { get; set; }
[Required(ErrorMessage = "请确定您是否已收到录取通知书!")]
public bool? HavingGet { get; set; }
}
}

如何使用呢?可以在控制器类中使用ModelState.IsValid属性来检查是否有验证问题。如下所示演示了在处理POST的RsvpForm动作方法中如何运用ModelState.IsValid.

[HttpPost]
public ViewResult RsvpForm(StudentResponse studentResponse)
{
if (ModelState.IsValid)
{
//TODO:发送studentResponse 邮件给学校
return View("Thanks", studentResponse);
}
else
{
//有验证错误--重新显示表单
return View();
} }

如果没有验证错误,就会同之前那样,告诉MVC渲染Thanks视图;如果有验证错误,则通过调用不带参数的View方法来重新渲染视图。

我们需要把验证错误信息显示给用户,通过在提交表单的视图中使用Html.ValidationSummary 辅助器方法,如下所示

<body>

@using(Html.BeginForm()){

@Html.ValidationSummary()

<p>您的名字:@Html.TextBoxFor(m => m.Name)</p>
<p>您的邮箱:@Html.TextBoxFor(m => m.Email)</p>

……

}

如果没有错误,这个Html.ValidationSummary方法会在表单中创建一个隐藏的列表条目占位符;否则,MVC会使这个占位符称为可见,并添加由验证注解属性定义的错误消息。如下所示

知道我们用于StudentResponse类的所有验证约束都得到满足,用户才会看到Thanks视图。注意,我们在表单中输入的数据是被保留的,并且,当带有验证摘要的视图被重新渲染时,被再次显示出来(这个有点象传统的ASP.NET Web Form)。这是我们通过模型绑定所得到的好处。

到这里一个简单的小应用程序基本算是完成了。

通过这几课的学习,我们对MVC有了大概的了解。

MVC自学第四课的更多相关文章

  1. MVC自学第三课

    上一课我们已经能够做出简单的HTML显示页面,并懂得了MVC的工作模式,这一课我们讲解一些动态的数据交互. 在MVC中,控制器的工作是构造某些数据,而视图的工作是把它渲染成HTML.数据是从控制器传递 ...

  2. 微信小程序自学第四课:数据绑定

    WXML 中的动态数据均来自对应 Page 的 data. 一.简单绑定 数据绑定使用 Mustache 语法(双大括号)将变量包起来,可以作用于: 1.内容 <view> {{ mess ...

  3. ASP.NET MVC Model验证(四)

    ASP.NET MVC Model验证(四) 前言 本篇主要讲解ModelValidatorProvider 和ModelValidator两种类型的自定义实现,前者是Model验证提供程序,而Mod ...

  4. ASP.NET MVC Model绑定(四)

    ASP.NET MVC Model绑定(四) 前言 前面的篇幅对于Model绑定器IModelBinder以及实现类型.Model绑定器提供程序都作了粗略的讲解,可以把Model绑定器想象成一个大的容 ...

  5. ASP.NET MVC Model元数据(四)

    ASP.NET MVC Model元数据(四) 前言 前面的篇幅讲解了Model元数据生成的过程,并没有对Model元数据生成过程的内部和Model元数据结构的详细解释.看完本篇后将会对Model元数 ...

  6. MVC系列——MVC源码学习:打造自己的MVC框架(四:了解神奇的视图引擎)

    前言:通过之前的三篇介绍,我们基本上完成了从请求发出到路由匹配.再到控制器的激活,再到Action的执行这些个过程.今天还是趁热打铁,将我们的View也来完善下,也让整个系列相对完整,博主不希望烂尾. ...

  7. ASP.NET MVC下的四种验证编程方式[续篇]

    在<ASP.NET MVC下的四种验证编程方式>一文中我们介绍了ASP.NET MVC支持的四种服务端验证的编程方式("手工验证"."标注Validation ...

  8. ASP.NET MVC下的四种验证编程方式

    ASP.NET MVC采用Model绑定为目标Action生成了相应的参数列表,但是在真正执行目标Action方法之前,还需要对绑定的参数实施验证以确保其有效性,我们将针对参数的验证成为Model绑定 ...

  9. MVC学习(四)几种分页的实现(3)

    在这篇MVC学习(四)几种分页的实现(2)博文中,根据URL中传入的两个参数(页码数,首页.上一页.下一页.末页的标记符)来获得对应的分页数据, 只是传入的参数太多,调用起来不太方便(标记符不能够写错 ...

随机推荐

  1. C# 2 运算符 if

    运算符: 一.算术运算符: + - * / % ——取余运算 取余运算的应用场景: 1.奇偶数的区分. 2.把数变化到某个范围之内.——彩票生成. 3.判断能否整除.——闰年.平年. int a = ...

  2. 深搜基础题目 杭电 HDU 1241

    HDU 1241 是深搜算法的入门题目,递归实现. 原题目传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1241 代码仅供参考,c++实现: #incl ...

  3. java如何防止反编译

    综述(写在前面的废话) Java从诞生以来,其基因就是开放精神,也正因此,其可以得到广泛爱好者的支持和奉献,最终很快发展壮大,以至于有今天之风光!但随着java的应用领域越来越广,特别是一些功能要发布 ...

  4. 星际争霸反作弊AG对战平台_支持108,113

    星际争霸反作弊AG对战平台_支持108,113,116 强大的星际反作弊功能,对战神器,让玩家公平对战 目前腾讯对战,浩方对战,VS对战平台都有星际外挂,AG平台什么都不干专门反外挂,希望热爱星际的玩 ...

  5. Scrapy入门程序点评

    1,引言 在<Scrapy的架构初探>一文,我基于爬虫开发的经验对Scrapy官网文章作了点评和解读,事件驱动的异步处理架构.极强的模块化等是个绝好的框架,接着我细读了官网的<Scr ...

  6. sqlplus部署

    1       下载客户端安装包根据系统选择(建议下载zip包) http://www.oracle.com/technetwork/database/features/instant-client/ ...

  7. Gentoo Linux 学习笔记2

         在RHEL系列的Linux操作系统中,可以通过rpm -ql package的方式来查看这个软件包共有哪一些文件所构成.在Gentoo下,也有这样的工具,equery.要使用这个工具,首先要 ...

  8. 浅析C++内存分配与释放操作过程——三种方式可以分配内存new operator, operator new,placement new

    引言:C++中总共有三种方式可以分配内存,new operator, operator new,placement new. 一,new operator 这就是我们最常使用的 new 操作符.查看汇 ...

  9. 转自:Python函数式编程指南(二):函数

    2. 从函数开始 2.1. 定义一个函数 如下定义了一个求和函数: 1 2 def add(x, y):     return x + y 关于参数和返回值的语法细节可以参考其他文档,这里就略过了. ...

  10. 新手必看:如何快速看懂VC++项目

    1.在具备必需的编程基础知识后,试图理解一份完整的代码可以从以下几个方面入手:   1)首先运行以下程序,从外部角度感受一下有哪些功能.  2)了解代码中每个类的功能.看看文档,或者类的注释,那么仅仅 ...