自动化CodeReview - ASP.NET Core请求参数验证
2018-06-22 06:09:35来源:未知 阅读 ()
自动化CodeReview系列目录
- 自动化CodeReview - ASP.NET Core依赖注入
- 自动化CodeReview - ASP.NET Core请求参数验证
参数验证实现
在做服务端开发时经常需要对客户端传入的参数进行合法性验证,在ASP.NET Core中通常会使用如下方式:
public class LoginModel { [Required(ErrorMessage = "账号不能为空")] public string Account { get; set; } [StringLength(12, MinimumLength = 6, ErrorMessage = "密码长度应介于6-12个字符之间")] public string Password { get; set; } }
public IActionResult Login(LoginModel model) { if (ModelState.IsValid) { //参数校验通过,处理登陆逻辑 } else { //参数校验失败,返回第一个错误 var firstErrorMsg = ModelState.GetFirstErrorMessage(); return Content(firstErrorMsg); } }
这么写虽然可以验证参数了,但还是要多写一个if...else...,能不能简化成只用一行代码就实现验证呢?
答案是:可以的,先看简化后的用法:
[ValidateModel] public IActionResult Login(LoginModel model) { //能执行到此处表示参数已验证通过 }
以上代码如果Account传空会返回:
{ "errCode": 3, "errMsg": "账号不能为空" }
与之前的区别是在Action上加了一个[ValidateModel],参数校验逻辑在ValidateModelAttribute里处理,这是MVC里Action过滤器的用法,篇幅限制我就不展开了,直接上代码:
namespace Mondol.WPDental.Web.Filters { /// <summary> /// 确保当前Action的Model是已验证的,否则返回错误响应结果 /// </summary> public class ValidateModelAttribute : Attribute, IActionFilter { public void OnActionExecuting(ActionExecutingContext context) { if (!context.ModelState.IsValid) { var result = new Result(ResultErrorCodes.ArgumentBad, context.ModelState.GetFirstErrorMessage()); context.Result = new JsonResult(result); } } public void OnActionExecuted(ActionExecutedContext context) { } } }
使用ValidateModel需要保证:
1. 项目中有统一的返回格式;例如:JSON或XML
2. 所有接口有统一的公共字段;例如:
{ "errCode": 0, //0成功,其它值失败 "errMsg": "失败时的错误消息", "data": { //成功时的返回数据 … } }
其实对于优秀的项目架构设计,以上2点都不是问题,只有“统一”才可以更好的抽象化代码,封装通用框架。
写到这里其实还不完美,如果Login上的[ValidateModel]忘加了呢?
编译也能通过,测试时还不容易发现。但这实实在在是个BUG,没有校验参数合法性啊。
自动化CodeReview之AutoReview
我始终坚信再牛掰的程序员也有疏忽的时候,有时写着写着就忘加了。
能不能在忘加的时候提醒一下呢?答案是:可以的。
本系列的第1篇我写了关于【ASP.NET Core依赖注入】的自动化CodeReview,在写参数验证自动化CodeView时我发现自动化CodeView其实有很多可写的。
为了将零散的代码整理到一起,也为了以后可以持续维护下去,我重开了一个项目,项目名暂定AutoReview,PS:大家如果有更好的名字欢迎赐教
项目代码我放到了github上,地址为:https://github.com/md-frank/AutoReview
先来看下它的用法:
先在Startup.ConfigureServices方法最后加入如下代码:
public void ConfigureServices(IServiceCollection services) { //注册服务代码放到此处 //此段放在最后 if (_env.IsDevelopment()) { services.AddAutoReview( new DependencyInjectionAssert(), new ValidateModelAssert() { ValidateModelAttributeType = typeof(ValidateModelAttribute) } ); } }
AddAutoReview方法接受一个IAssert数组,表示要使用的断言,目前支持2个断言DependencyInjectionAssert、ValidateModelAssert
然后在在Startup.Configure方法中加入如下代码:
public void Configure(IApplicationBuilder app, ILoggerFactory loggerFactory) { //使用AutoReview,代码位置任意 if (_env.IsDevelopment()) app.UseAutoReview(); }
至此如果任意断言验证失败,UseAutoReview方法都会抛出异常,并提示问题代码的具体位置,终止项目运行。
现在你就可以在开发过程中发现BUG了,解决问题后重新运行即可。
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- asp.net源程序编译为dll文件并调用的实现过程 2020-03-29
- Asp.net MVC SignalR来做实时Web聊天实例代码 2020-03-29
- ASP.NET MVC中jQuery与angularjs混合应用传参并绑定数据 2020-03-29
- Asp.Net中WebForm的生命周期 2020-03-29
- ASP.NET使用Ajax返回Json对象的方法 2020-03-23
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash