2014-02-09 79 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

很好,這個想法爲多個任務幫助我解決方案 –