.net使用FluentValidation进行服务端验证。
背景
最近使用asp.mvc 做一个在线口语系统项目,在服务端验证问题遇到了一些小问题。
自己根据数据库表user定义一个数据库表实体对象UserDbEntity
[Table("User")]
public class UserDbEntity : DbEntityModelBase
{
[Description("用户名")]
[Required(ErrorMessage="*")]
public string Name
{
get;
set;
}
[Description("邮箱")]
[Required]
public string Email
{
get;
set;
}
[Description("密码")]
[Required(ErrorMessage="*")]
public string Pwd
{
get;
set;
}
[Description("确认密码,数据库不存在该字段")]
[Required(ErrorMessage = "*")]
public string SecondPwd
{
get;
set;
}
[Description("真实姓名")]
[Required]
public string TrueName
{
get;
set;
}
[Description("邮箱是否已激活,长度为1")]
public int Actived
{
get;
set;
}
}
/// <summary>
/// 所有DbEntityModel项目中的实体必须继承DbEntityModelBase或其子类,使用supperType模式控制共有子类的行为或者状态,此项目中的类根据数据库基本表或者视图保持基本一致
/// </summary>
public abstract class DbEntityModelBase
{
[Description("Guid标识")]
public string GuidMark
{
get;
set;
}
[Description("自增Id列")]
public int Id
{
get;
set;
}
[Description("排序,倒序")]
public int Sort
{
get;
set;
}
}
在前端页面有一个登陆页面直接使用UserDbEntity实体对象UserDbEntity
<form id="login_form" style="padding: 10px 20px 10px 40px;" action="Login" method="post">
<p>
<em>用户名</em>@Html.EditorFor(model=>model.User.Name) @Html.ValidationMessageFor(model=>model.Name)</p>
<p>
<em>密码</em>@Html.PasswordFor(model=>model.Pwd) @Html.ValidationMessageFor(model=>model.User.Pwd)</p>
<div style="padding: 5px; text-align: center;">
<a href="#" onclick="$('#login_form').submit();return false" class="easyui-linkbutton" icon="icon-ok">登录</a>
<a href="#" onclick="$('#login_form')[0].reset()" class="easyui-linkbutton"
icon="icon-cancel">重填</a>
</div>
</form>
在控制器中对输入进行验证
[HttpPost]
public ActionResult Login(UserDbEntity loginModel)
{
bool loginFlag = false;
string name = loginModel.Name;
string pwd = loginModel.Pwd; ;
if(ModelState.IsValid){
return Login();
}
var user = new UserDbEntity(); using (var scope = IocRegisterBLL.ContainerBLLComponent.BeginLifetimeScope())
{
var userBLL = scope.Resolve<UserBLL>();
loginFlag = userBLL.AdminLogin(name, pwd, out user);
} if (loginFlag)
{
Session[C_LogOnSession] = user;
return Index();
}
else
{
return Login();
}
}
ModelState.IsValid 永远是false。因为我们的表单对email输入,email是空,用mvc服务端验证机制验证,永远不能通过。
遇到问题,我们就要思考。现在我有两种思路解决问题。
第1种方法是。 为每个页面制定一个ViewModel, 然后这个ViewModel在使用DataAnnotations ,最后使用mvc服务端的验证机制。 当然这个方法也是大项目使用最多的方法。 ViewModel 和UserDbEntity之间的转化时候AutoMapper 进行DTO。 但这个方法我不太喜欢,因为我觉得我这个项目属于中小项目,没必要每个页面制定一个ViewModel。 于是我找到了第2种方法。
第2种方法。使用FluentValidation验证。使用FluentValidation 为login页面 对 UserDbEntity 写一个验证类。
使用FluentValidation 解决背景介绍中遇到的问题
1 引用: FluentValidation.dll ,可以直接 Nuget ,Install-Package FluentValidation。
2. 编写UserLoginValidator类
public class UserLoginValidator: AbstractValidator<UserDbEntity>
{
public UserLoginValidator()
{
RuleFor(u=>u.Name).NotNull().WithMessage("用户名不能为空");
RuleFor(u => u.Pwd).NotNull().WithMessage("密码不能为空");
}
}
3、在login controller使用 UserLoginValidator类进行验证。
[HttpPost]
public ActionResult Login(UserDbEntity loginModel)
{
bool loginFlag = false;
string name = loginModel.Name;
string pwd = loginModel.Pwd;
UserLoginValidator validInstance = new UserLoginValidator();
if(!validInstance.Validate(loginModel).IsValid){
return Login();
}
var user = new UserDbEntity(); using (var scope = IocRegisterBLL.ContainerBLLComponent.BeginLifetimeScope())
{
var userBLL = scope.Resolve<UserBLL>();
loginFlag = userBLL.AdminLogin(name, pwd, out user);
} if (loginFlag)
{
Session[C_LogOnSession] = user;
return Index();
}
else
{
return Login();
}
}
这样就能解决我在背景中碰到的问题。 如果项目中其他页面也用到到UserDbEntity,但验证规则需要个性化,你也可以另外针对UserDbEntity写另外一个Validator类。
这样就不必要对给个页面制定一个ViewModel了。
推荐在项目中使用FluentValidation进行服务端验证
FluentValidation 在个github上的地址 https://github.com/JeremySkinner/FluentValidation。FluentValidation的链式方法调用,写验证非常的流畅。可以为你在项目中写服务端验证逻辑节省不少时间。
.net使用FluentValidation进行服务端验证。的更多相关文章
- ASP.NET MVC如何实现自定义验证(服务端验证+客户端验证)
ASP.NET MVC通过Model验证帮助我们很容易的实现对数据的验证,在默认的情况下,基于ValidationAttribute的声明是验证被使用,我们只需 要将相应的ValidationAttr ...
- JSR-303 Bean Validation 介绍及 Spring MVC 服务端验证最佳实践
任何时候,当要处理一个应用程序的业务逻辑,数据校验是你必须要考虑和面对的事情. 应用程序必须通过某种手段来确保输入参数在上下文来说是正确的. 分层的应用在很多时候,同样的数据验证逻辑会出现在不同的层, ...
- C#在服务端验证客户端证书(Certificate)
使用https协议进行通讯的时候可以设置双向证书认证,客户端验证服务端证书的方法前面已经介绍过了,现在说一下在服务端验证客户端证书的方案. 这里给出的方案比较简单,只需要在Service端的配置文件中 ...
- ASP.NET的服务端验证(干货)
最近有项目需要使用.net的web,啥也不说,直接开始学习.net的mvc框架.感觉微软的web项目其实还是很好用的,今天和大家分享一下服务端验证的事情.其实原理就是用到了c#的特性,特性不用多说,大 ...
- Asp.net MVC 服务端验证多语言错误
服务端验证用户提交信息时为了实现多语言使用了资源文件,如: using System.ComponentModel.DataAnnotations; public class UserModel { ...
- Easyui validatebox后台服务端验证
Easyui validatebox的验证提示十分好用,可是在实际项目的运用中,经常会遇到需要服务器验证后并返回验证结果信息,比如验证用户名.手机号.邮箱是否已存在.于是就想着怎么拓展Easyui的验 ...
- MIME类型-服务端验证上传文件的类型
MIME的作用 : 使客户端软件,区分不同种类的数据,例如web浏览器就是通过MIME类型来判断文件是GIF图片,还是可打印的PostScript文件. web服务器使用MIME来说明发送数据的种类, ...
- Angular4 后台管理系统搭建(9) - 用自定义angular指令,实现在服务端验证
最近这段时间发现,北京这用angular4 或 angular2的公司很少.几乎是没有.很担心自己是不是把精力放到了不应该的地方.白耽误了时间.但是随着我对新版angular框架理解的加深.个人感觉a ...
- TCP之传输对象 客户端传输user对象到服务端 验证登录是否合法
Server.java package com.sxt.tcp4; import java.io.IOException; import java.io.ObjectInputStream; impo ...
随机推荐
- Android学习之 Intent详解
一. Intent 作用 Intent 是一个将要执行的动作的抽象的描述,一般来说是作为参数来使用,由Intent来协助完成android各个组件之间的通讯.比如说调用startActivity()来 ...
- 剑指offer题目61-67
面试题61:把二叉树打印成多行 public class Solution { public ArrayList<ArrayList<Integer> > Print(Tree ...
- Centos7 Cacti-0.8.8g安装及SNMP简介
在官网可以看到关于cacti的下载说明http://www.cacti.net/download_cacti.php Download Cacti The latest stable version ...
- 怎样把windows中安装的程序列出来?
症状/问题我怎样把windows中安装的程序信息输出到一个文本文件中?解决方法使用 windows 操作系统中的命令:wmic就可以做到.下面的命令就可以把系统中安装的程序都输出到文件ProgramL ...
- table中的标题行冻结的简单实现
这里只是简单的实现,主要是用了position属性的fixed属性值,这个属性值需要高版本浏览器的支持,如果要兼容低版本的浏览器可以通过写脚本的方式实现,也可以使用UI库,有些UI库里面表格插件的标题 ...
- ansible 2.2的源码编译安装
ansible代码下载地址:http://releases.ansible.com/ansible/ # git clone git://github.com/ansible/ansible.git ...
- 国内从事GIS行业的公司及其网址
www.esrichina-bj.cn esri中国北京http://www.lingtu.com/ 北京灵图软件技术有限公司(三维gis) http://www.spatialport.com.cn ...
- C++二级指针第二种内存模型(二维数组)
C++二级指针第二种内存模型(二维数组) 二维数组 二维数组本质上是以数组作为数组元素的数组,即“数组的数组”. 定义 类型说明符 数组名[常量表达式][常量表达式] 例如: float a[3][4 ...
- berkeley db replica机制 - 主从同步
repmgr/repmgr_net.c, __repmgr_send(): 做send_broadcast, 然后根据policy 对DB_REP_PERMANENT的处理 __repmgr_send ...
- 2015年9月10-11日,杨学明老师《IPD DRY RUN》专题培训在武汉某上市企业成功举办!
2015-9-10~11日,杨学明老师为武汉著名的光通信企业某上市公司实施了为期两天的“IPD DRY RUN”,开班前,该公司三个项目团队的负责人先后发言,烽火PMO部门领导和公开研发部网管系统的领 ...