zoukankan      html  css  js  c++  java
  • asp.net 远程模型验证

    有这样一些场景,我们需要模型验证,某些字段不允许重复,但是又不希望在数据访问层增加一堆额外逻辑判断。
    我们需要数据访问层简洁,这种模型验证在进去Action之前,验证不通过直接告诉前端。

    一个特性,继承ValidationAttribute,实现
    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    重载

    代码段附上

    public class RemoteValidateAttribute: ValidationAttribute
        {
            public string Controller { get; set; }
            public string Action { get; set; }
            public string HttpMethod { get; set; } = "GET";
    
            protected override ValidationResult IsValid(object value, ValidationContext validationContext)
            {
                var url = $"{HostInformat.Instance.Host}/{Controller}/{Action}";
                var client = new RestClient(url);
                var request = new RestRequest(HttpMethod.Equals("POST", StringComparison.InvariantCultureIgnoreCase) ? Method.POST : Method.GET);
    
                request.AddParameter(validationContext.MemberName, value);
    
                var response = client.Execute<ValidateInformat>(request);
    
                if (response.IsSuccessful)
                {
                    var result = response.Data;
    
                    if (result.Status)
                    {
                        return ValidationResult.Success;
                    }
    
                    return new ValidationResult(result.Message);
                }
    
                return new ValidationResult($"Action:{url}无法访问");
            }
        }
        public class ValidateInformat
        {
            public bool Status { get; set; }
            public string Message { get; set; }
    
            public static implicit operator ValidateInformat(string message)
            {
                return new ValidateInformat()
                {
                    Status = false,
                    Message = message
                };
            }
    
            public static implicit operator ValidateInformat(bool status)
            {
                return new ValidateInformat()
                {
                    Status = status,
                    Message = null
                };
            }
        }
        public class HostInformat
        {
            public HostInformat(IConfiguration conf)
            {
                Host = conf["urls"];
    
                if (Instance == null)
                {
                    Instance = this;
                }
            }
    
            public string Host { get; }
    
            public static HostInformat Instance { get; set; }
        }

    调用

    [RemoteValidate(Action = "FindPlatformUserForAccount", Controller = "Validata", HttpMethod = "Post")]
    public string Account { get; set; }

    验证的Action

        public class ValidataController : Controller
        {
            [HttpPost]
            public ValidateInformat FindPlatformUserForAccount(string Account)
            {
                var result = PlatformUserHelper.ExistsForAccount(Account);
    
                if (result)
                {
                    return "账号名已存在";
                }
    
                return true;
            }
        }

    网络请求部分是用的RestSharp

    在Startup.cs
    ConfigureServices方法内增加如下代码

                services.AddSingleton<IConfiguration>(Configuration);
                services.AddSingleton<HostInformat>();

    Configure方法内增加如下代码

                var hostInformat = app.ApplicationServices.GetRequiredService<HostInformat>();
                HostInformat.Instance = hostInformat;
  • 相关阅读:
    实验四 决策树算法及应用
    实验三 朴素贝叶斯算法及应用
    实验二 K-近邻算法及应用
    实验一 感知器及其应用
    实验3: 面向对象分析与设计
    实验2:结构化分析与设计
    实验1:软件开发文档与工具的安装与使用
    软件工程第三次作业——ATM管理系统
    软件工程第二次作业——举例分析流程图与活动图的区别与联系
    软件工程第一次作业——小学四则运算题目生成程序
  • 原文地址:https://www.cnblogs.com/NCoreCoder/p/9790983.html
Copyright © 2011-2022 走看看