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;
  • 相关阅读:
    Struts2中validate数据校验的两种常用方法
    Oracle中主键、外键、索引、序列、唯一性约束的创建
    Hibernate学习(五)Hibernate 多对多映射
    oracle实现主键自增
    现代软件工程 第三章:【软件工程师的成长】练习与讨论
    现代软件工程 第十七章 【人、绩效和职业道德】 练习与讨论
    现代软件工程 第十章 【典型用户和场景】 练习与讨论
    现代软件工程 第八章 【需求分析】练习与讨论
    现代软件工程 第七章 【MSF】练习与讨论
    现代软件工程 第六章 【敏捷流程】练习与讨论
  • 原文地址:https://www.cnblogs.com/NCoreCoder/p/9790983.html
Copyright © 2011-2022 走看看