转载:Remote Validation

http://www.jb51.net/article/89474.htm

 

大多数的开发者,可能会遇到这样的情况:当我们在创建用户之前,有必要去检查是否数据库中已经存在相同名字的用户。换句话说就是,我们要确保程序中,只有一个唯一的用户名,不能有重复的。相信大多数人都有不同的解决方法,但是ASP.NET MVC中,为我们提供了一个特性,就是Remote Validation,用它可以解决类似这样的问题。

Remote Validation调用了一个Ajax请求,可以是GET或者POST方式,接着调用方法,这个方法,至少要有一个参数,并且方法的返回类型是Json格式的。【MVC中通过JSOnResult来做到】,这个方法的参数就是要验证的实体的属性【必须,否则不能验证,参数的大小写无所谓。】,如果这个验证的方法返回值是true,那么就表名存在相同的用户,我们就返回false,给前台页面。表明验证不通过。

好了,直接说正题吧!
首先新建一个空白的MVC项目,在Model文件夹下,新建一个类RemoteUser: 

?
1
2
3
4
5
6
public class RemoteUser
  {
  public string Name { get ; set ; }
  public string Email { get ; set ; }
  
  }

然后建一个测试的数据类: 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public static class MyRemoteStaticData
{
public static List<RemoteUser> RemoteList
{
get
{
return new List<RemoteUser>()
{
new RemoteUser(){Name= "Daniel" ,Email= "Daniel@163.com" },
new RemoteUser(){Name= "CFS" ,Email= "CFS@163.com" }
};
}
 
}
}
 

在新建一个控制器MyRemoteController 【主要用来Remote验证】:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
using Server_Side_Validation_IN_MVC.StaticData;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
 
namespace Server_Side_Validation_IN_MVC.Controllers
{
  public class MyRemoteController : Controller
  {
  // GET: MyRemote
  public JsonResult RemoteValidate( string name) //这里的参数名字,必须要和视图中文本框控件的名字一样,但大小写无所谓
  {
  //如果存在用户名,即isExists=true
  bool isExists = MyRemoteStaticData.RemoteList.
  Where(s => s.Name.ToLowerInvariant().
   Equals(name.ToLower())).FirstOrDefault() != null ;
  //就向前台返回false,表明已经存在userName
  return Json(!isExists,JsonRequestBehavior.AllowGet);
  }
 
  
 
  
}

上面添加完验证之后,我们来修改一下Model实体:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
 
namespace Server_Side_Validation_IN_MVC.Models
{
  public class RemoteUser
  {
  [Remote( "RemoteValidate" , "MyRemote" , ErrorMessage = "抱歉用户名已经存在!请重新输入!!!" )]
  public string Name { get ; set ; }
 
  
  public string Email { get ; set ; }
 
  
  }
}

然后在新建一个测试的控制器: 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
 
namespace Server_Side_Validation_IN_MVC.Controllers
{
  public class UserController : Controller
  {
  
 
  public ActionResult AddRemoteUser()
  {
  return View();
  }
  }
}

添加AddRemoteUser视图,【注意这里,Remote Validation是需要引入Jquery插件和启用客户端验证的】

这里勾选引入脚本库,也主要是用来引入Jquery插件。 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
@model Server_Side_Validation_IN_MVC.Models.RemoteUser
 
@{
  ViewBag.Title = "AddRemoteUser";
}
 
< h2 >AddRemoteUser</ h2 >
 
 
@using (Html.BeginForm())
{
  @Html.AntiForgeryToken()
  
  < div class = "form-horizontal" >
  < h4 >RemoteUser</ h4 >
  < hr />
  @Html.ValidationSummary(true, "", new { @class = "text-danger" })
  < div class = "form-group" >
  @Html.LabelFor(model => model.Name, htmlAttributes: new { @class = "control-label col-md-2" })
  < div class = "col-md-10" >
  @Html.EditorFor(model => model.Name, new { htmlAttributes = new { @class = "form-control" } })
  @Html.ValidationMessageFor(model => model.Name, "", new { @class = "text-danger" })
  </ div >
  </ div >
 
  < div class = "form-group" >
  @Html.LabelFor(model => model.Email, htmlAttributes: new { @class = "control-label col-md-2" })
  < div class = "col-md-10" >
  @Html.EditorFor(model => model.Email, new { htmlAttributes = new { @class = "form-control" } })
  @Html.ValidationMessageFor(model => model.Email, "", new { @class = "text-danger" })
  </ div >
  </ div >
 
  
 
  < div class = "form-group" >
  < div class = "col-md-offset-2 col-md-10" >
  < input type = "submit" value = "Create" class = "btn btn-default" />
  </ div >
  </ div >
  </ div >
}
 
< div >
  @Html.ActionLink("Back to List", "Index")
</ div >
 
< script src = "~/Scripts/jquery-1.10.2.min.js" ></ script >
< script src = "~/Scripts/jquery.validate.min.js" ></ script >
< script src = "~/Scripts/jquery.validate.unobtrusive.min.js" ></ script >

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

?
1
2
3
4
5
6
7
8
9
10
public static void RegisterRoutes(RouteCollection routes)
  {
  routes.IgnoreRoute( "{resource}.axd/{*pathInfo}" );
 
  routes.MapRoute(
  name: "Default" ,
  url: "{controller}/{action}/{id}" ,
  defaults: new { controller = "User" , action = "AddRemoteUser" , id = UrlParameter.Optional }
  );
  }

运行项目:

输入测试数据:CFS,按Tab键后,自动就进行验证了。 

这里我们对Name字段就进行了Remote验证,现在我想对Email字段进行验证,需要使用到AdditionalFields,属性,还需要另外添加一个验证方法: 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
using Server_Side_Validation_IN_MVC.StaticData;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
 
namespace Server_Side_Validation_IN_MVC.Controllers
{
  public class MyRemoteController : Controller
  {
  // GET: MyRemote
  public JsonResult RemoteValidate( string name) //这里的参数名字,必须要和视图中文本框控件的名字一样,但大小写无所谓
  {
  //如果存在用户名,即isExists=true
  bool isExists = MyRemoteStaticData.RemoteList.
  Where(s => s.Name.ToLowerInvariant().
   Equals(name.ToLower())).FirstOrDefault() != null ;
  //就向前台返回false,表明已经存在userName
  return Json(!isExists,JsonRequestBehavior.AllowGet);
  }
 
 
  public JsonResult RemoteValidationAddtional( string name, string email)
  {
  //如果存在用户名,即isExists=true
  bool isExists = MyRemoteStaticData.RemoteList.
  Where(s => s.Name.ToLowerInvariant().
   Equals(name.ToLower()) && s.Email.ToLowerInvariant().Equals(email.ToLower())).FirstOrDefault() != null ;
  //就向前台返回false,表明已经存在userName
  return Json(!isExists, JsonRequestBehavior.AllowGet);
  }
  }
}
 

然后修改对应的实体类: 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
 
namespace Server_Side_Validation_IN_MVC.Models
{
  public class RemoteUser
  {
  [Remote( "RemoteValidate" , "MyRemote" , ErrorMessage = "抱歉用户名已经存在!请重新输入!!!" )]
  public string Name { get ; set ; }
 
  //注意,这里的AdditionalFields="Name",Name字段必须和Modle中的字段完全一样
  [Remote( "RemoteValidationAddtional" , "MyRemote" , AdditionalFields = "Name" , ErrorMessage = "抱歉Email已经存在!请重新输入!!!" )]
  public string Email { get ; set ; }
 
  }
  }

接着运行项目:

输入在测试类中写的测试数据:

这里就对两个字段进行了Remote Validation了。
上面使用了AdditionalFields 验证字段,如果我们想要验证不只一个字段,可以在AddtionalFiled里面添加,以逗号分隔就行了。

转载于:https://www.cnblogs.com/hao-1234-1234/p/7652128.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值