Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 用于自定义属性验证的asp mvc core 3客户端验证_C#_Asp.net Core - Fatal编程技术网

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();
    }