2014-02-09 80 views
2

所以我期望创建一些表单字段的自定义验证,并需要一个想法如何解决这个问题。验证将连接到外部API提供程序并检查数据是否唯一。ASP.NET MVC线程自定义验证

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

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

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

谢谢。

+0

所以从JavaScript或从控制器这个外部API调用? –

+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); 
    } 
} 
+0

很好,这个想法为多个任务帮助我解决方案 –