Asp.net 不引人注目的验证不适用于自定义验证属性
我试图在MVC中编写一个自定义验证属性,但我无法使它作为一个无阻碍的验证工作。它可以与回发(有点)配合使用,但由于表单位于对话框上,因此我必须进行Ajax风格的调用,否则它将无法使用。也许我想做的是无法实现的。问题是我需要连接到数据库来进行检查 我为我的问题做了一个简单的演示 我的模型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
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请求对服务器进行检查,但通常人们决定不这样做
您可以按照本指南了解实施不引人注目的验证的详细信息:
通常,您需要执行以下操作:
IClientValidable
IClientValidable
您可能需要查看[Remote]验证属性。只需创建一个返回JsonResult的控制器方法,并将其映射到远程属性。这可能是完成你想要做的事情的最简单的方法
[Remote( "IsNameUnique", "Customers", HttpMethod = "post" )]
public override string Name { get; set; }
[HttpPost]
public JsonResult IsNameUnique( string name )
{
// Code
}
如果要将其实现为自定义验证,则需要执行以下操作:
iclientvalidable
。这要求您实现GetClientValidationRules()
方法。使用您的类型和参数返回新的客户端验证规则李>
下面是一个例子:
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.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检查数据库。我不能在用户输入任何内容之前在页面上隐藏数千个客户名称。我缺少什么