欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

ASP.NET MVC5验证系列之服务端验证

程序员文章站 2023-11-27 09:25:34
 这篇文章,我将会说到,使用数据注解api来进行服务端验证。asp.net mvc 框架在执行的时候,验证所有传递到控制器的数据,如果验证失败就把错误消息,填充到...

 这篇文章,我将会说到,使用数据注解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 }
   );
  }

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

ASP.NET MVC5验证系列之服务端验证

运行之后,

ASP.NET MVC5验证系列之服务端验证

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

ASP.NET MVC5验证系列之服务端验证

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

ASP.NET MVC5验证系列之服务端验证

 好了,现在看看第二种方式,使用数据注解来进行服务端验证:
 新建一个类:避免混淆, 

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>


ASP.NET MVC5验证系列之服务端验证

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

ASP.NET MVC5验证系列之服务端验证

name不为空,email为空

ASP.NET MVC5验证系列之服务端验证

name不为空,email输入非法格式数据

ASP.NET MVC5验证系列之服务端验证

两个都输入合法的数据:

ASP.NET MVC5验证系列之服务端验证

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。