2014-02-09 3 views
2

Так что я ищу для создания выборочной проверки некоторых полей формы и вам нужна идея, как подойти к этому. Проверка будет подключаться к внешним провайдерам api и проверять, уникальны ли данные.ASP.NET MVC Custom Validation with Threads

Это занимает некоторое время, поэтому я решил создать проверку в нескольких потоках с помощью асинхронного контроллера (async, wait).

Поэтому, когда я нажимаю кнопку «Отправить», он подключается к 3 различным внешним apis и проверяет данные асинхронно.

Что было бы лучше всего здесь? Или я должен просто создать customValidation с наследованием ValidationAttribute?

Спасибо.

+0

так это внешние вызовы API из Java-или из контроллера? –

+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

славная, эта идея для множественных задач помогла мне с решением –

0

Для этого можно создать данные для проверки данных DataAnnotation. В стороне сервера атрибута проверки вы можете вызывать внешние API, а в стороне клиента (адаптер проверки, написанный в js/jQuery) сделать асинхронные вызовы внешним API.

Вы можете проверить это для справки: http://programersnotebook.blogspot.in/2013/03/customizing-validation-attributes-in-mvc.html