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里面添加,以逗号分隔就行了。

转载:Remote Validation的更多相关文章

  1. MVC学习系列13--验证系列之Remote Validation

    大多数的开发者,可能会遇到这样的情况:当我们在创建用户之前,有必要去检查是否数据库中已经存在相同名字的用户.换句话说就是,我们要确保程序中,只有一个唯一的用户名,不能有重复的.相信大多数人都有不同的解 ...

  2. Implementing Remote Validation in MVC

    Using Validation Code Step 1: Create model for Catalog table and apply the the remote validation for ...

  3. asp net core Remote Validation 无法验证

    [注意这里,Remote Validation是需要引入Jquery插件和启用客户端验证的]

  4. 转载 jQuery validation

    之前做客户端验证感觉自己javascript 不行,虽然能写出来一完整的验证,但从不自信,一直觉得客户端验证是比较繁琐的事情,但是又不能不做,只到最开始接触ajax ,遇到了一个jQuery vali ...

  5. [转载]Remote Desktop Manager 9.0.10.0 Enterprise 附企业版注册码 (强大的远程控制软件)

    http://www.52xiazai.net/pcsoft/network/yuanchen/20131206/2429.html

  6. Model Validation in Asp.net MVC

    原文:Model Validation in Asp.net MVC 本文用于记录Pro ASP.NET MVC 3 Framework中阐述的数据验证的方式. 先说服务器端的吧.最简单的一种方式自然 ...

  7. MVC学习系列4--@helper辅助方法和用户自定义HTML方法

    在HTML Helper,帮助类的帮助下,我们可以动态的创建HTML控件.HTML帮助类是在视图中,用来呈现HTML内容的.HTML帮助类是一个方法,它返回的是string类型的值. HTML帮助类, ...

  8. Chapter 2: Design the user experience

    Apply the user interface design for a web application 介绍了Css的常用属性和html5的新element,以及Htmlhelper的简单方法,如 ...

  9. Extjs 表单验证后,几种错误信息展示方式

    今天要求对form表单验证,进行系统学习一下,故做了几个示例: Ext.onReady(function(){        var panel=Ext.create('Ext.form.Panel' ...

随机推荐

  1. C# Task

    Task是一种基于任务的编程模型.它与thread的主要区别是,它更加方便对线程进程调度和获取线程的执行结果. Task类和thread类,前者接收的是Action委托类型,后者接收的是Func委托类 ...

  2. s11 day 102 python Linux环境安装 与路飞项目 微信平台接口

    1.微信公众号平台沙箱环境地址 https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login 二.结算中心业务 结算中心: -购物车,删 ...

  3. H - The LCIS on the Tree HDU - 4718

    The LCIS on the Tree Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Oth ...

  4. kali Linux 上编译并使用RFID核弹——proxmark3

    你还在在Windows下使用proxmark3?弱爆了! 本文作者:i春秋签约作家——冰尘 作为一个标准的日天日地日空气的(单身贵族泰迪)物理黑客Proxmark3这么高大上的东西应该是在键盘敲打声中 ...

  5. 基于Spark的FPGrowth算法的运用

    一.FPGrowth算法理解 Spark.mllib 提供并行FP-growth算法,这个算法属于关联规则算法[关联规则:两不相交的非空集合A.B,如果A=>B,就说A=>B是一条关联规则 ...

  6. java获取当前文件路径的方法

    第一种: File f = new File(this.getClass().getResource("/").getPath()); System.out.println(f); ...

  7. 为autoLayout 增加标识符,方便调试

     如上图,是一个十分简单的布局. root view 上加了一个 button 和一个 webview. 不加标识符的样子 视图层级中没有标识  只有 UIView.WKWebView 之类,如果 ...

  8. Python小白学习之路(十四)—【作用域】【匿名函数】【编程方法论】【高阶函数】

    吧啦吧啦内心戏 在没有具体学作用域之前,我在之前的学习笔记中就有提到 我开始以为是自己自创的词儿 没想到这个词早已经存在(手动捂脸) 真是个无知的小火锅(不知者无罪) 我发现自己最擅长做的事情,就是给 ...

  9. 【OpenCV3】cvRound()、cvFloor()、cvCeil()函数详解

    函数cvRound().cvFloor().cvCeil()都是按照一种舍入方式将浮点型数据转换为整型数据. cvRound():返回跟参数最接近的整数值,即四舍五入: cvFloor()  :返回不 ...

  10. SS配置

    { "server":"0.0.0.0", "server_port":8388, "local_address": & ...