所以我希望创建一些表单字段的自定义验证,并且需要知道如何处理这个问题。验证将连接到外部api提供程序并检查数据是否唯一。
这需要一些时间,所以我想借助异步控制器(异步,等待)在多个线程中创建验证。
因此,当我点击提交按钮时,它会连接到3个不同的外部api并异步检查数据。
这里最好的做法是什么?或者我应该只继承ValidationAttribute创建customValidation吗?
感谢。
答案 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