Asp.net 不引人注目的验证不适用于自定义验证属性

Asp.net 不引人注目的验证不适用于自定义验证属性,asp.net,asp.net-mvc,unobtrusive-validation,Asp.net,Asp.net Mvc,Unobtrusive Validation,我试图在MVC中编写一个自定义验证属性,但我无法使它作为一个无阻碍的验证工作。它可以与回发(有点)配合使用,但由于表单位于对话框上,因此我必须进行Ajax风格的调用,否则它将无法使用。也许我想做的是无法实现的。问题是我需要连接到数据库来进行检查 我为我的问题做了一个简单的演示 我的模型 public class Customer { public int Id { get; set; } [IsNameUnique] [Required] public stri

我试图在MVC中编写一个自定义验证属性,但我无法使它作为一个无阻碍的验证工作。它可以与回发(有点)配合使用,但由于表单位于对话框上,因此我必须进行Ajax风格的调用,否则它将无法使用。也许我想做的是无法实现的。问题是我需要连接到数据库来进行检查

我为我的问题做了一个简单的演示

我的模型

public class Customer
{
    public int Id { get; set; }

    [IsNameUnique]
    [Required]
    public string Name { get; set; }
}
观点:

@model WebApplication1.Models.Customer

@using (Html.BeginForm("Index", "Home", FormMethod.Post, new { @id = "NewForm" }))
{
    @Html.ValidationSummary(true)

    @Html.EditorFor(m => m.Name)
    @Html.ValidationMessageFor(m => m.Name)

    <br />
    <input type="submit" value="Submit" />
}
Post方法

[HttpPost]
    public ActionResult Index(Customer customer)
    {
        if(ModelState.IsValid)
        {
            //add customer
        }
        return View();
    }
数据库调用

class CustomerRepository
{
    internal bool IsNameUnique(object value)
    {
        //call to database
        return false;
    }
}
有一个带有名称字段的表单。我需要检查数据库中是否已经有这个名字

我的问题是如何在我的案例中进行低调风格验证?我在SO上找到了关于iClientValidable的其他帖子,但没有一篇真正说明我需要做什么。i、 e.他们都没有对照数据库进行检查。谢谢。

基本上,“不引人注目的验证”是指“客户端验证,以不引人注目的方式定义”。这里的关键点是“客户端”,即可以通过客户端浏览器中的JavaScript进行验证

检查名称唯一性涉及服务器端资源,虽然可以通过JavaScript使用AJAX请求对服务器进行检查,但通常人们决定不这样做

您可以按照本指南了解实施不引人注目的验证的详细信息:

通常,您需要执行以下操作:

  • 在web.config中启用不引人注目的验证
  • 在页面中包括jQuery、jQuery验证和不引人注目的脚本
  • 为自定义验证属性实现
    IClientValidable
  • 实现并注册自定义属性的客户端规则
  • 基本上,“不引人注目的验证”是指“以不引人注目的方式定义的客户端验证”。这里的关键点是“客户端”,即可以通过客户端浏览器中的JavaScript进行验证

    检查名称唯一性涉及服务器端资源,虽然可以通过JavaScript使用AJAX请求对服务器进行检查,但通常人们决定不这样做

    您可以按照本指南了解实施不引人注目的验证的详细信息:

    通常,您需要执行以下操作:

  • 在web.config中启用不引人注目的验证
  • 在页面中包括jQuery、jQuery验证和不引人注目的脚本
  • 为自定义验证属性实现
    IClientValidable
  • 实现并注册自定义属性的客户端规则

  • 您可能需要查看[Remote]验证属性。只需创建一个返回JsonResult的控制器方法,并将其映射到远程属性。这可能是完成你想要做的事情的最简单的方法

    [Remote( "IsNameUnique", "Customers", HttpMethod = "post" )]
    public override string Name { get; set; }
    
    
    [HttpPost]
    public JsonResult IsNameUnique( string name )
    {
        // Code
    }
    
    如果要将其实现为自定义验证,则需要执行以下操作:

  • 在属性中,实现
    iclientvalidable
    。这要求您实现
    GetClientValidationRules()
    方法。使用您的类型和参数返回新的客户端验证规则 下面是一个例子:

  • 然后需要实现jQuery验证规则。这是您进行ajax调用的地方:

    jQuery.validator.addMethod("pastdateonly", function (val, element, params) {
        var value = $.trim($(element).val());
        if (value === "") return true;
    
        var maxDate = params.maxdate,
            dteVal = new Date(value),
            mxDte = new Date(maxDate);
    
        return dteVal < mxDte;
    });
    
  • 例如:

    您可能需要查看[Remote]验证属性。只需创建一个返回JsonResult的控制器方法,并将其映射到远程属性。这可能是完成你想要做的事情的最简单的方法

    [Remote( "IsNameUnique", "Customers", HttpMethod = "post" )]
    public override string Name { get; set; }
    
    
    [HttpPost]
    public JsonResult IsNameUnique( string name )
    {
        // Code
    }
    
    如果要将其实现为自定义验证,则需要执行以下操作:

  • 在属性中,实现
    iclientvalidable
    。这要求您实现
    GetClientValidationRules()
    方法。使用您的类型和参数返回新的客户端验证规则 下面是一个例子:

  • 然后需要实现jQuery验证规则。这是您进行ajax调用的地方:

    jQuery.validator.addMethod("pastdateonly", function (val, element, params) {
        var value = $.trim($(element).val());
        if (value === "") return true;
    
        var maxDate = params.maxdate,
            dteVal = new Date(value),
            mxDte = new Date(maxDate);
    
        return dteVal < mxDte;
    });
    
  • 例如:

    无阻碍验证不适用于自定义验证属性,它只适用于内置验证,如果要基于自定义验证进行验证,必须为其编写jquery代码。好的。。。谢谢你的评论似乎仍然有可能做到这一点。如果你不是说单独实现jquery验证(它不会使用数据注释),你能告诉我我需要在客户端上做些什么来实现这一点吗?通畅验证不适用于自定义验证属性,它只适用于内置验证,如果你想基于自定义验证进行验证,您必须为它编写jquery代码。好的。。。谢谢你的评论似乎仍然有可能做到这一点。如果你不是说单独实现jquery验证(不使用数据注释),你能告诉我我需要在客户机上做些什么来实现这一点吗?你基本上是说我想做的是不可能的,因为它需要服务器端资源吗?我想我已经尝试了您所说的大部分内容,我最好的猜测是,不引人注目的验证不是为Ajax Requirest设计的。。同时,我发现了jquery验证远程属性。。客户端验证可以在jquery验证中使用ajax请求开箱即用。。但是,如何与数据注释混合使用?这很神秘,不是吗?@lawphotog这是可能的,但您需要编写相当复杂的自定义客户端验证规则。它应该在客户端验证规则内同步请求服务器-请参阅我在回答中共享的链接,其中描述了
    $.validator.addMethod(“dategreaterthan”)
    逻辑。如果数据库中已经存在
    值,则服务器请求基本上应该返回-也就是说,如果验证失败或通过对不起..我仍然不完全理解..您提到的示例将值放在客户端..没有涉及ajax请求..或者是吗?我的情况是,一旦用户输入值,它就会我们应该通过ajax检查数据库。我不能在用户输入任何内容之前在页面上隐藏数千个客户名称。我缺少什么