asp.net 远程模型验证
有这样一些场景,我们需要模型验证,某些字段不允许重复,但是又不希望在数据访问层增加一堆额外逻辑判断。
我们需要数据访问层简洁,这种模型验证在进去Action之前,验证不通过直接告诉前端。
一个特性,继承ValidationAttribute,实现
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
重载
代码段附上
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; }
}
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 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}无法访问");
}
}
调用
[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;
本文介绍了一种在ASP.NET中实现远程模型验证的方法,通过自定义属性避免了在数据访问层添加额外逻辑,实现了在Action前进行字段唯一性检查,并返回前端提示。
661

被折叠的 条评论
为什么被折叠?



