分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 前端开发

当asp.net core偶遇docker一(模型验证和Rabbitmq 三)

发布时间:2023-09-06 02:21责任编辑:彭小芳关键词:暂无标签

继续上一篇

上一篇,从core方式实现了一个Rabbitmq发送队列消息的接口,我们现在需要在模型验证里面加入验证失败就发送消息的部分

 ???
???[AttributeUsage(AttributeTargets.Class)]
???public class ValidateBaseAttribute:ValidationAttribute ???{ ???????protected override ValidationResult IsValid(object value, ValidationContext validationContext) ???????{ ???????????return ValidationResult.Success; ???????} ???}

这个验证特性打上之后,只要模型验证就触发

转到 ValidationContext 里面

在ValidateBaseAttribute内修改如下

 ??[AttributeUsage(AttributeTargets.Class)] ???public class ValidateBaseAttribute:ValidationAttribute ???{ ???????public Type Type { get; set; } ???????public string FunName { get; set; } ???????public ValidateBaseAttribute() ???????{ ???????} ???????public ValidateBaseAttribute(Type type, string funName) ???????{ ???????????Type = type; ???????????FunName = funName; ???????} ???????private bool ExecuteMethod(Type type, string funName,object value) ???????{ ???????????if (type == null || string.IsNullOrWhiteSpace(funName)) ???????????????return false; ???????????try ???????????{ ???????????????var instance = Activator.CreateInstance(type); ???????????????var method = type.GetMethod(funName); ???????????????return (bool)method.Invoke(instance, new[] { value }); ???????????} ???????????catch ???????????{ ???????????????return false; ???????????} ???????} ???????protected override ValidationResult IsValid(object value, ValidationContext validationContext) ???????{ ???????????var validate = ExecuteMethod(Type, FunName, value); ???????????if (validate) ???????????{ ???????????????var remoteSend = validationContext.GetService(typeof(IRemoteSend)) as IRemoteSend; ???????????????if (remoteSend != null) ???????????????{ ???????????????????remoteSend.Send(value);
???????????????????return new ValidationResult("验证失败"); ???????????????} ???????????} ???????????return ValidationResult.Success; ???????} ???}

在默认的ValuesController内增加方法

 ???????[HttpGet("Check")] ???????public User Check([FromQuery]User user) ???????{ ???????????return user; ???????}

我们修改以下User类

//增加一个验证特性[ValidateBase(typeof(ValidateClass), "IsValidateUser")]
 ???public class ValidateClass ???{ ???????public bool IsValidateUser(User user) ???????{ ???????????return user.Name.Equals("admin", StringComparison.InvariantCultureIgnoreCase) || user.Account.Equals("admin", StringComparison.InvariantCultureIgnoreCase); ???????} ???}

只要用户名或者账号为admin

你以为这样就完了?No,模型验证要触发,必须有一个模型验证触发的过滤器

 ???public class ModelFilter : ActionFilterAttribute ???{ ???????public override void OnActionExecuting(ActionExecutingContext context) ???????{ ???????????if (!context.ModelState.IsValid) ???????????{ ???????????????string errorMessage = string.Empty; ???????????????var ErrorsModel = context.ModelState.Values.Where(item => { return item.Errors.Count > 0; }).ToList().FirstOrDefault(); ???????????????if (ErrorsModel != null) ???????????????{ ???????????????????errorMessage = ErrorsModel.Errors[0].ErrorMessage; ???????????????} ???????????????context.Result = new JsonResult(new { status = -1, msg = errorMessage }); ???????????????return; ???????????} ???????} ???}

在ConfigureServices内的

//services.AddMvc();services.AddMvc(options => options.Filters.Add<ModelFilter>());

运行起来测试一下

当asp.net core偶遇docker一(模型验证和Rabbitmq 三)

原文地址:https://www.cnblogs.com/NCoreCoder/p/9939816.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved