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;
  • 相关阅读:
    cliconfg
    SQL 校验身份证格式
    常用MIME类型汇总
    SqlBulkCopy批量将Excel(Aspose)数据导入至SQL Server
    C#生成图片验证码
    SqlServer PIVOT函数快速实现行转列,UNPIVOT实现列转行
    SQL Server 中 EXEC 与 SP_EXECUTESQL 的区别
    C#常用加密方式
    CURSOR 游标使用示例
    linux命令
  • 原文地址:https://www.cnblogs.com/NCoreCoder/p/9790983.html
Copyright © 2011-2022 走看看