【问题标题】:ASP.NET MVC Custom Validation with Threads带有线程的 ASP.NET MVC 自定义验证
【发布时间】:2014-02-09 02:12:56
【问题描述】:

因此,我希望为某些表单字段创建自定义验证,并且需要了解如何处理此问题。验证将连接到外部 api 提供程序并检查数据是否唯一。

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

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

这里的最佳做法是什么?还是应该只创建 customValidation 并继承 ValidationAttribute ?

谢谢。

【问题讨论】:

  • 那么这个外部 api 是从 javascript 调用还是从控制器调用?
  • 服务器端通过控制器

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


【解决方案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);
    }
}

【讨论】:

  • 很好,这个多任务的想法帮助我解决了问题
【解决方案2】:

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

您可以查看此内容以供参考:http://programersnotebook.blogspot.in/2013/03/customizing-validation-attributes-in-mvc.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多