在使用表单获取用户输入的数据时,我们必须对数据进行有效性验证,因为来自网络的信息都是不可信的。同时也要给用户即时的反馈,避免让用户感到困惑。这就涉及到数据验证的范畴。

数据验证最直接的做法是在服务器端对回传的数据加以甄别。在MessageBoard这个demo中,用户留言时昵称和留言内容都不能为空,并且留言内容不得少于15字。为此我们需要修改Write动作方法。

        [HttpPost]
public ActionResult Write(Message message)
{
if (string.IsNullOrEmpty(message.NickName))
{
ModelState.AddModelError("NickName", "昵称不能为空");
}
if (string.IsNullOrEmpty(message.Content))
{
ModelState.AddModelError("Content", "内容不能为空");
}
else if(message.Content.Count() < )
{
ModelState.AddModelError("Content", "内容不能少于15字");
}        
if (ModelState.IsValid)
{

                message.ReleaseDate = DateTime.Now;
                messages.Add(message);   
Response.Redirect("/Home/Index");
return View();
}
else
{
return
View(message);
}

}

我们添加一组if语句来判断回传的数据,注意ModelState包含模型绑定的状态。通过ModelState.AddModelError添加错误信息以及ModelState.IsValid判断模型是否通过验证。

接下来要在Write视图显示验证错误提示,可以使用一些HTML辅助方法帮助我们完成。示例如下。

<body>
<h1>MVC留言板</h1>
@using (Html.BeginForm("Write", "Home"))
{
@Html.ValidationSummary()
@Html.LabelFor(m=>m.NickName,"昵称")
@Html.TextBoxFor(m => m.NickName)
<br /><br />
@Html.LabelFor(m => m.Content,"内容")
@Html.TextAreaFor(m => m.Content,5,50,null)
<br /><br />
<input type="submit" value="提交" />
}
</body>

Html.ValidationSummary可以显示模型验证的所用错误,如下图所示。

如果想在文本框之后显示错误信息,可以使用Html.ValidationMessageFor方法。

<body>
<h1>MVC留言板</h1>
@using (Html.BeginForm("Write", "Home"))
{
@Html.LabelFor(m=>m.NickName,"昵称")
@Html.TextBoxFor(m => m.NickName)
@Html.ValidationMessageFor(m=>m.NickName)
<br /><br />
@Html.LabelFor(m => m.Content,"内容")
@Html.TextAreaFor(m => m.Content,5,50,null)
@Html.ValidationMessageFor(m=>m.Content)
<br /><br />
<input type="submit" value="提交" />
}
</body>

效果如下。

Html.ValidationMessageFor方法在页面渲染时会生成一个<span>标签,如@Html.ValidationMessageFor(m=>m.NickName) 生成为<span class="field-validation-error" data-valmsg-replace="true" data-valmsg-for="NickName">昵称不能为空</span>,我们可以利用生成的span标签的class属性修改CSS样式,使页面更美观。

ASP.NET MVC轻教程 Step By Step 10——模型验证的更多相关文章

  1. ASP.NET MVC轻教程 Step By Step 1 ——入门

    使用ASP.NET MVC有一段时间了,本人还是非常喜欢ASP.NET MVC这个框架模式的.在经历了WebForm复杂粗暴的做法后,自然感觉简洁优雅的MVC清新可人,只不过WebForm和MVC的设 ...

  2. ASP.NET MVC轻教程 Step By Step 8——路由

    在前面的教程里,细心的你可能会有个疑问,就是地址栏输入/Home/Write就可以进入留言页面.无论是静态HTML还是ASP/ASP.NET.PHP,URL都是和某个页面相关.比如假设有个URL是“w ...

  3. ASP.NET MVC轻教程 Step By Step 13——页面布局

    一般在一个网站中页面会使用相同的结构和元素,如果每个页面都要重复添加这些元素,不仅繁琐更会给我们后期维护带来大麻烦.所以我们采用网页模板之类的技术,将固定不变的元素放入模板,同时留下一些占位符供页面各 ...

  4. ASP.NET MVC轻教程 Step By Step 12——客户端验证

    前面两节使用的两种数据验证方法都是在服务器端进行的,也就是提交了表单,数据回传给服务器才能验证.这样会带来两个问题,一是用户体验不好,用户提交了表单之后才知道存在问题:二是会给服务器带来额外的压力.我 ...

  5. ASP.NET MVC轻教程 Step By Step 9——分页

    现在我们要把Index视图的留言信息进行分页显示. Step 1. 创建路由 我们希望以类似地址http://localhost:41583/Page1来表示第一页,Page2表示第二页,以此类推.在 ...

  6. ASP.NET MVC轻教程 Step By Step 7——改进Write动作方法

    在上一节我们使用强类型视图改进Write视图获得更好的智能感知和代码重构,现在可以进一步的改进动作方法. Step 1. 数据模型绑定 在Save方法中我们使用Request来获取表单传送的值,其实可 ...

  7. ASP.NET MVC轻教程 Step By Step 6——改进表单

    上一节我们使用原始的HTML表单来完成留言功能,但是ASP.NET MVC提供了丰富的HTML辅助方法来帮助我们构建更简洁优雅的表单. Step 1. 修改Form标签 首先,我们可以使用Html.B ...

  8. ASP.NET MVC轻教程 Step By Step 2 ——View初探

    在上一节我们完成了一个最简化的MVC程序,最重要的是下面这段代码. public class HomeController : Controller { public string Index() { ...

  9. ASP.NET MVC轻教程 Step By Step 4——Model、View和Controller

    ASP.NET MVC中的Model(数据模型)主要包括定义数据结构.数据库读写.数据验证等等和对象处理相关的工作. 在解决方案资源管理器中找到Model文件夹,点击右键,添加一个新类,名为“Mess ...

随机推荐

  1. 【JAVA - SSM】之MyBatis开发DAO

    在SSM框架中的DAO层就是MyBatis中的Mapper,Mapper分为两部分:Mapper接口(JAVA文件)和Mapper映射文件(XML文件).DAO开发(Mapper开发)有两种方式:原始 ...

  2. 【JAVA - SSM】之MyBatis与原生JDBC、Hibernate访问数据库的比较

    首先来看一下原生JDBC访问数据库的代码: public static void main(String[] args) { // 数据库连接 Connection connection = null ...

  3. Android_adb使用

    Android Debug Bridge version 1.0.26 - #当升级 Android SDK 后,ADB 也会随之升级. adb [-d|-e|-s {<serialNumber ...

  4. 二维码URL自己主动辨别Android和ISO设备,以便扫码后倒入不同的下载链接

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  5. MapReduce中的map个数

    在map阶段读取数据前,FileInputFormat会将输入文件分割成split.split的个数决定了map的个数.影响map个数(split个数)的主要因素有: 1) 文件的大小.当块(dfs. ...

  6. 为centos6.5系统添加epel源

    1.进去http://fedoraproject.org/wiki/EPEL 2.因为系统是centos 6.5,所以获取epel-release-latest-6.noarch.rpm的地址(htt ...

  7. request对象

    Servlet三大域对象的应用 request.session.application(ServletContext) 请求转发器: public void doGet(HttpServletRequ ...

  8. hdu2034java

    人见人爱A-B Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  9. vi 使用笔记

    基本A 当前行追加J 去除本行和下一行之间的换行符(写CSS利器)~ 光标所在处的字符进行大小写互换* 向前搜索目前光标所在的单词# 向后搜索目前光标所在的单词% 查找与光标所在处相匹配的反括号, 包 ...

  10. NHibernate动态加载资源文件

    最近做项目,又用到了以前做过的ORM框架--NHibernate. 此次想要实现的目标: 1.简单SQL用NHibernate的Session的CRUD方法实现 2.复杂SQL用Native SQL实 ...