C# ASP.NET MVC自定义线程验证

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。 在验证属性的服务器端部分,

因此,我希望创建一些表单字段的自定义验证,并需要了解如何实现这一点。验证将连接到外部api提供程序,并检查数据是否唯一

这需要一些时间,所以我想在异步控制器(async,await)的帮助下在多个线程中创建验证

因此,当我单击submit按钮时,它连接到3个不同的外部API并异步检查数据

这里的最佳做法是什么?或者我应该通过继承ValidationAttribute创建customValidation吗


谢谢。

您可以为此创建自定义数据验证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,这个多任务的想法帮助我解决了这个问题