MVC学习系列10---验证系列之服务器端验证

这篇文章,我将会说到,使用数据注解API来进行服务端验证。ASP.NET MVC 框架在执行的时候,验证所有传递到控制器的数据,如果验证失败就把错误消息,填充到ModelState对象中,并且把这个对象传递给控制器,然后控制器中的方法,根据Modelstate的状态来判断,是否验证失败还是验证通过。

在这里,我将会使用两种方法来验证数据的合法性,一个是手动添加错误消息到ModelState对象中,另外一个方法是使用数据注解【Data Annotation】 API,来做。

先来看看使用手动验证的方式吧:

我们新建一个空白的MVC项目:添加一个Student实体:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace Server_Side_Validation_IN_MVC.Models
{
    public class Student
    {
        public string Name { get; set; }

        public string Email { get; set; }

    }
}

然后添加一个Student控制器:

using Server_Side_Validation_IN_MVC.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
using System.Web;
using System.Web.Mvc;

namespace Server_Side_Validation_IN_MVC.Controllers
{
    public class StudentController : Controller
    {
        // GET: Student
        public ActionResult Index()
        {
            return View();
        }

        [HttpPost]
        public ActionResult Index(Student model)
        {

            //服务端验证,方法一,手动添加错误消息到ModelState对象中

            //如果Name是空的
            if (string.IsNullOrEmpty(model.Name))
            {
                ModelState.AddModelError("Name", "Name is required");
            }

            //如果Email是空的
            if (string.IsNullOrEmpty(model.Email))
            {
                ModelState.AddModelError("Email", "Email is required");
            }
            else
            {
                string emailRegex = @"^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}" +
                                            @"\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\" +
                                               @".)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$";
                Regex re = new Regex(emailRegex);
                //Email不为空的时候,但格式不合法
                if (!re.IsMatch(model.Email))
                {
                    ModelState.AddModelError("Email", "Email is not valid");
                }
            }
            //实体验证通过
            if (ModelState.IsValid)
            {
                ViewBag.Name = model.Name;
                ViewBag.Email = model.Email;
            }
            return View(model);
        }
    }
}

创建Index视图:

@model Server_Side_Validation_IN_MVC.Models.Student
@{
    Layout = null;
}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Index</title>
</head>
<body>
    <div>
        @using (Html.BeginForm())
        {
        //使用ViewData.ModelState.IsValid来判断ModelState的状态
            if (ViewData.ModelState.IsValid)
            {
                if (ViewBag.Name != null)
                {
                <b>
                    Name:@ViewBag.Name<br/>
                    Email:@ViewBag.Email
                </b>
                }
            }

            <fieldset>
                <legend>Student</legend>
                <div>
                    @*生成label标签*@
                    @Html.LabelFor(model=>model.Name)
                </div>
                <div>
                    @*生成文本框*@
                    @Html.EditorFor(model=>model.Name)
                    @*不合法*@
                   //// @if (!ViewData.ModelState.IsValid)//这样写有问题正确的写法: @if (!ViewData.ModelState.IsValid &&ViewData.ModelState["Email"].Errors.Count>0)
                    {
               //从字典中获取错误消息:@ViewData.ModelState["Name"].Errors[0].ErrorMessage
                    <span style="color:red">@ViewData.ModelState["Name"].Errors[0].ErrorMessage</span>
                    }

                </div>
                <div>
                    @Html.LabelFor(model=>model.Email)
                </div>
                <div>
                    @Html.EditorFor(model=>model.Email)
                    /////@if (!ViewData.ModelState.IsValid)  这样写有问题:                     // 正确的写法在下面                   @if (!ViewData.ModelState.IsValid &&ViewData.ModelState["Email"].Errors.Count>0)
                    {
                        //从字典中获取错误消息:@ViewData.ModelState["Email"].Errors[0].ErrorMessage
                        <span style="color:red">@ViewData.ModelState["Email"].Errors[0].ErrorMessage</span>
                    }
                </div>
                <p>
                    <input type="submit" value="Create"/>
                </p>
            </fieldset>

        }
    </div>
</body>
</html>

然后,修改一下默认的路由:

 public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Student", action = "Index", id = UrlParameter.Optional }
            );
        }

运行项目:

首先:验证一下,不输入任何数据,点击Create:

然后验证一下,Name有值,而Email没有值的情况:

运行之后,报错。查找了一下原因,修改了一下视图代码:

运行之后,

接着验证一下,Name不为空,Email输入非法格式的数据:

最后验证一下,输入合法的数据:

好了,现在看看第二种方式,使用数据注解来进行服务端验证

新建一个类:避免混淆,

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Web;

namespace Server_Side_Validation_IN_MVC.Models
{
    public class StudentServer
    {
        [Required(ErrorMessage="Name为必填项")]
        public string Name { get; set; }

        [Required(ErrorMessage="电子邮件必须")]
        [EmailAddress(ErrorMessage="电子邮件格式不对")]
        public string Email { get; set; }
    }
}

在控制器中新建两个方法:

 public ActionResult SeverSideIndex()
        {
            return View();
        }

        [HttpPost]
        public ActionResult SeverSideIndex(StudentServer model)
        {
            if (ModelState.IsValid)
            {
                ViewBag.Name = model.Name;
                ViewBag.Email = model.Email;
            }
            return View();

        }

对应的视图:

@model Server_Side_Validation_IN_MVC.Models.StudentServer
@{
    Layout = null;
}
@if (ViewData.ModelState.IsValid)
{
    if (ViewBag.Name != null)
    {
    <b>
        Name:@ViewBag.Name<br />
        Email:@ViewBag.Email
    </b>
    }
}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>SeverSideIndex</title>
</head>
<body>
    <div>
        @using (Html.BeginForm())
        {
        @Html.ValidationSummary(true)
            <fieldset>
                <legend>Student</legend>
                <div>
                    @Html.LabelFor(model=>model.Name)
                </div>
                <div>
                    @Html.EditorFor(model=>model.Name)
                    @Html.ValidationMessageFor(model=>model.Name)
                </div>
                <div>
                    @Html.LabelFor(model => model.Email)
                </div>
                <div>
                    @Html.EditorFor(model => model.Email)
                    @Html.ValidationMessageFor(model => model.Email)
                </div>
                <p>
                    <input type="submit" value="Create"/>
                </p>
            </fieldset>

        }
    </div>
</body>
</html>

运行一下:

首先验证,都为空的情况:

Name不为空,Email为空

Name不为空,Email输入非法格式数据

两个都输入合法的数据:

好了,以上就是MVC中服务端验证了,我们一般是使用第二种,来进行验证。也就是数据注解。

时间: 2024-10-04 15:17:24

MVC学习系列10---验证系列之服务器端验证的相关文章

net5:自定义验证控件服务器端验证与客户端验证的使用

原文发布时间为:2008-07-29 -- 来源于本人的百度文章 [由搬家工具导入] using System;using System.Data;using System.Configuration;using System.Collections;using System.Web;using System.Web.Security;using System.Web.UI;using System.Web.UI.WebControls;using System.Web.UI.WebContro

MVC学习系列——Model验证扩展

MVC中,实现了前端后端的验证. 前端验证.步骤: web.config这两个得开启: <add key="ClientValidationEnabled" value="true" /> <add key="UnobtrusiveJavaScriptEnabled" value="true" /> JS设置 第一步:引入页面js @Scripts.Render("~/bundles/jque

MVC学习系列11---验证系列之客户端验证

前面学习了,服务端验证,这篇文章中,我们接着学习客户端验证,客户端的验证,使用Jquery和Jquery插件来实现[jquery.validate.min.js and jquery.validate.unobtrusive.min.js)] 在服务端验证中,页面必须要提交到服务器,进行验证,如果数据验证不通过,服务器端就会发送一个响应到客户端,然后客户端根据相应的信息,进行处理:而客户端验证则不同,用户输入的数据,只要一提交,客户端就会进行先验证,如果不通过就报错,不会提交到服务器进行验证,如

MVC学习系列——ModelBinder扩展

在MVC系统中,我们接受数据,运用的是ModelBinder 的技术. MVC学习系列——ActionResult扩展在这个系列中,我们自定义了XmlResult的返回结果. 那么是不是意味着能POST一个XML数据类型给我们项目,这样的话,我们需要自定义一个XmlModelBinder来接受XML数据. 新建XmlModelBinder,继承于:IModelBinder 1 public class XmlModelBinder : IModelBinder 2 { 3 public obje

ASP.NET MVC学习系列(二)-WebAPI请求

继续接着上文 ASP.NET MVC学习系列(一)-WebAPI初探 来看看对于一般前台页面发起的get和post请求,我们在Web API中要如何来处理. 这里我使用Jquery 来发起异步请求实现数据调用. 继续使用上一文章中的示例,添加一个index.html页面,添加对jquery的引用. 一.无参数Get请求 一般的get请求我们可以使用jquery提供的$.get() 或者$.ajax({type:"get"}) 来实现: 请求的后台Action方法仍为上篇文章中的GetU

EF5+MVC4系列(10) mvc的布局页面 _ViewStart.Cshtml

当客户端请求 /Product/Index的时候, 如果在视图的根目录下有 _ViewStart.Cshtml 就会先执行这个,再去执行 Product文件夹下的Index视图, 如果Product文件夹下也有 _ViewStart.Cshtml文件,那么优先执行这个文件,再去执行 Index视图 根目录下的ViewStart中的数据,可以通过 Page.Title这样 或者是 PageData["key"] 这样传递给 下面的Product下的ViewStart视图,直至到目标 In

ASP.NET MVC学习系列(二)-WebAPI请求(转)

转自:http://www.cnblogs.com/babycool/p/3922738.html 继续接着上文 ASP.NET MVC学习系列(一)-WebAPI初探 来看看对于一般前台页面发起的get和post请求,我们在Web API中要如何来处理. 这里我使用Jquery 来发起异步请求实现数据调用. 继续使用上一文章中的示例,添加一个index.html页面,添加对jquery的引用. 一.无参数Get请求 一般的get请求我们可以使用jquery提供的$.get() 或者$.ajax

ASP.Net Core 2.2 MVC入门到基本使用系列 (三)

本教程会对基本的.Net Core 进行一个大概的且不会太深入的讲解, 在您看完本系列之后, 能基本甚至熟练的使用.Net Core进行Web开发, 感受到.Net Core的魅力. 本教程知识点大体分为以下几个阶段 ASP.Net Core MVC基础知识 Startup基本配置和理解 Controller使用 Razor视图 传统视图 Model Validation (基本用法) 一点点的Vue (教程使用Vue配合) SqlSugar ORM (进行数据库交互) Entity Frame

社保系列10——返回值速查表

9000 命令执行成功 6006 依据传输模式,所要读取的字节长度错 61xx 正常处理.'xx'表示可以通过后续 GET RESPONSE命令得到的额外数据长度 6281 回送数据可能出错 6282 文件长度<Le 6283 选择文件无效 6284 FCI格式与P2指定的不符 6300 认证失败 63Cx 验证失败,x =0 表示不提供计数器 x !=0 表示重试次数 6581 EEPROM损坏,导致卡锁定 6700 Lc或Le长度错 6900 无信息提供 6901 命令不接受(无效状态) 6

学习Hadoop不错的系列文章

1)Hadoop学习总结 (1)HDFS简介 (2)HDFS读写过程解析 (3)Map-Reduce入门 (4)Map-Reduce的过程解析 (5)Hadoop的运行痕迹 (6)Apache Hadoop 版本 2)Hadoop-0.20.0源代码分析 (1)Hadoop-0.20.0源代码分析(01) 地址:http://blog.csdn.net/shirdrn/article/details/4569702 (2)Hadoop-0.20.0源代码分析(02) 地址:http://blog