使用线程进行ASP.NET MVC自定义验证

时间:2014-02-09 02:12:56

标签: c# asp.net asp.net-mvc multithreading validation

所以我希望创建一些表单字段的自定义验证,并且需要知道如何处理这个问题。验证将连接到外部api提供程序并检查数据是否唯一。

这需要一些时间,所以我想借助异步控制器(异步,等待)在多个线程中创建验证。

因此,当我点击提交按钮时,它会连接到3个不同的外部api并异步检查数据。

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

感谢。

2 个答案:

答案 0 :(得分:1)

您可以使用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);
    }
}

答案 1 :(得分:0)

您可以为此创建自定义数据验证DataAnnotation。 在验证属性的服务器端部分,您可以调用外部API,在客户端部分(用js / jQuery编写的验证适配器)对外部API进行异步调用。

您可以查看此信息作为参考:http://programersnotebook.blogspot.in/2013/03/customizing-validation-attributes-in-mvc.html