C# 用于自定义属性验证的asp mvc core 3客户端验证
我创建了一个自定义验证属性,如下所示:C# 用于自定义属性验证的asp mvc core 3客户端验证,c#,asp.net-core,C#,Asp.net Core,我创建了一个自定义验证属性,如下所示: public class UniqueTitleAttribute : ValidationAttribute { protected override ValidationResult IsValid( object value, ValidationContext validationContext) { var context = (MyDBContext)vali
public class UniqueTitleAttribute : ValidationAttribute
{
protected override ValidationResult IsValid(
object value, ValidationContext validationContext)
{
var context = (MyDBContext)validationContext.GetService(typeof(MyDBContext));
var entity = context.Pages.SingleOrDefault(e => e.Title == value.ToString());
if (entity != null)
{
return new ValidationResult(GetErrorMessage(value.ToString()));
}
return ValidationResult.Success;
}
public string GetErrorMessage(string title)
{
return $"Title {title} is already in use.";
}
}
以及模型中的:
[UniqueTitle]
public string Title { get; set; }
它工作得很好,但是我也希望能够添加客户端验证?您必须使用jquery和不引人注目的客户端验证,以便在中获取这些URL
You have to use jquery and unobtrusive client side validation so fetch those urls in
your page.
Use like
<label asp-for="Name"></label>
<input asp-for="Name"/>
<span asp-validation-for="Name"></span>
Here i have taken example of Name as validation will fire on Name property but you can
change property on which you want.
你的页面。
像
这里我举了一个Name的例子,因为验证将在Name属性上启动,但您可以
更改所需的属性。
在自定义验证属性中,实现IClientModelValidator
接口并创建AddValidation
方法。在AddValidation
方法中,为验证添加data-
属性,如下所示:
public class UniqueTitleAttribute : ValidationAttribute, IClientModelValidator
{
protected override ValidationResult IsValid(
object value, ValidationContext validationContext)
{
var context = (ApplicationDbContext)validationContext.GetService(typeof(ApplicationDbContext));
var entity = context.Articles.SingleOrDefault(e => e.Title == value.ToString());
if (entity != null)
{
return new ValidationResult(GetErrorMessage(value.ToString()));
}
return ValidationResult.Success;
}
public void AddValidation(ClientModelValidationContext context)
{
Type obj = typeof(Article);
if (context == null)
{
throw new ArgumentNullException(nameof(context));
}
MergeAttribute(context.Attributes, "data-val", "true");
MergeAttribute(context.Attributes, "data-val-uniquetitle", GetErrorMessage());
}
private bool MergeAttribute(IDictionary<string, string> attributes, string key, string value)
{
if (attributes.ContainsKey(key))
{
return false;
}
attributes.Add(key, value);
return true;
}
public string GetErrorMessage()
{
return $"The title is already in use.";
}
public string GetErrorMessage(string title)
{
return $"Title {title} is already in use.";
}
}
将标题列表保存在视图的Get方法的ViewBag中,以判断标题是否正在从js使用:
public IActionResult CreateArticle()
{
ViewBag.TitleList = _context.Articles.Select(a => a.Title).ToList();
return View();
}
结果:
我将包括这些,但是对于自定义验证器,您还需要自定义js代码。您还必须创建自定义客户端验证逻辑。这是记录在案的:@ChrisPratt是的,我知道这一点,但我并不是真的明白,你能确认我的c代码足够吗?此外,在扩展validator时,在我的例子中,它应该是类似于:
$.validator.addMethod('uniquetitle'
)?文档会说什么?您需要尝试一个解决方案。如果遇到问题,我们可以帮您解决。目前的情况是,它只是“为我编写此代码”,而这不是堆栈溢出的目的。
public IActionResult CreateArticle()
{
ViewBag.TitleList = _context.Articles.Select(a => a.Title).ToList();
return View();
}