C# ASP.NET MVC自定义线程验证
因此,我希望创建一些表单字段的自定义验证,并需要了解如何实现这一点。验证将连接到外部api提供程序,并检查数据是否唯一 这需要一些时间,所以我想在异步控制器(async,await)的帮助下在多个线程中创建验证 因此,当我单击submit按钮时,它连接到3个不同的外部API并异步检查数据 这里的最佳做法是什么?或者我应该通过继承ValidationAttribute创建customValidation吗C# ASP.NET MVC自定义线程验证,c#,asp.net,asp.net-mvc,multithreading,validation,C#,Asp.net,Asp.net Mvc,Multithreading,Validation,因此,我希望创建一些表单字段的自定义验证,并需要了解如何实现这一点。验证将连接到外部api提供程序,并检查数据是否唯一 这需要一些时间,所以我想在异步控制器(async,await)的帮助下在多个线程中创建验证 因此,当我单击submit按钮时,它连接到3个不同的外部API并异步检查数据 这里的最佳做法是什么?或者我应该通过继承ValidationAttribute创建customValidation吗 谢谢。您可以为此创建自定义数据验证DataAnnotation。 在验证属性的服务器端部分,
谢谢。您可以为此创建自定义数据验证DataAnnotation。 在验证属性的服务器端部分,您可以调用外部API,在客户端部分(用js/jQuery编写的验证适配器)对外部API进行异步调用
您可以检查此项以供参考:您可以使用
RemoteAttribute
。此属性通过在MVC控制器中调用操作来验证输入
例如,我们验证名称是否唯一
public class SampleModel
{
[Remote("ValidateName" /*action*/, "Home" /*controller*/)]
public string Name { get; set; }
}
ValidateName操作
public class HomeController : Controller
{
public async Task<JsonResult> ValidateName(string name)
{
//the external validator
var externalValidators = new Func<string, Task<bool>>[]
{
ExternalValidator1,
ExternalValidator2,
ExternalValidator3
};
//execute each asynchronously and wait for all to finish
var externalValidatorTasks = externalValidators.Select(i => i(name)).ToArray();
await Task.WhenAll(externalValidatorTasks);
//return "invalid!" if any validation failed
if (externalValidatorTasks.Any(i => !i.Result))
{
return Json("invalid!", JsonRequestBehavior.AllowGet);
}
//name is valid
return Json(true, JsonRequestBehavior.AllowGet);
}
//mock external validation
public Task<bool> ExternalValidator1(string name)
{
return Task.FromResult(true);
}
}
公共类HomeController:控制器
{
公共异步任务ValidateName(字符串名称)
{
//外部验证器
var externalValidators=new Func[]
{
外部验证程序1,
外部验证程序2,
外部验证器3
};
//异步执行每一个,并等待所有操作完成
var externalValidatorTasks=externalValidators.Select(i=>i(name)).ToArray();
等待任务。WhenAll(外部验证任务);
//如果任何验证失败,则返回“无效!”
if(externalValidatorTasks.Any(i=>!i.Result))
{
返回Json(“无效!”,JsonRequestBehavior.AllowGet);
}
//名称是有效的
返回Json(true,JsonRequestBehavior.AllowGet);
}
//模拟外部验证
公共任务ExternalValidator1(字符串名称)
{
返回Task.FromResult(true);
}
}
那么这个外部api调用是来自javascript还是来自控制器?服务器端通过controllernice,这个多任务的想法帮助我解决了这个问题