Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/256.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# FluentValidation使用数据库进行唯一名称验证_C#_Asp.net_Asp.net Mvc_Asp.net Mvc 4_Fluentvalidation - Fatal编程技术网

C# FluentValidation使用数据库进行唯一名称验证

C# FluentValidation使用数据库进行唯一名称验证,c#,asp.net,asp.net-mvc,asp.net-mvc-4,fluentvalidation,C#,Asp.net,Asp.net Mvc,Asp.net Mvc 4,Fluentvalidation,我有一个具有名称字段的类别模型,每个类别名称都必须是唯一的。我已经进行了验证,当我尝试创建新类别时,它可以工作,但在尝试编辑它时,我遇到了问题。现在,它只是检查名称是否存在,当然,当我试图编辑相同的类别时,它确实存在 模型 [验证程序(类型(类别验证程序))] 公共类类别 { 公共int ID{get;set;} 公共字符串名称{get;set;} 虚拟公共ICollection映像{get;set;} } 公共类CategoryValidator:抽象验证器 { 公共类别验证器() { Rul

我有一个具有名称字段的类别模型,每个类别名称都必须是唯一的。我已经进行了验证,当我尝试创建新类别时,它可以工作,但在尝试编辑它时,我遇到了问题。现在,它只是检查名称是否存在,当然,当我试图编辑相同的类别时,它确实存在

模型

[验证程序(类型(类别验证程序))]
公共类类别
{
公共int ID{get;set;}
公共字符串名称{get;set;}
虚拟公共ICollection映像{get;set;}
}
公共类CategoryValidator:抽象验证器
{
公共类别验证器()
{
RuleFor(x=>x.Name).NotEmpty().WithMessage(“需要类别名称”).Must(UniqueName).WithMessage(“此类别名称已存在”);
}
私有布尔唯一名称(字符串名称)
{
ProjecteDataContext_db=新ProjecteDataContext();
var category=_db.Categories.Where(x=>x.Name.ToLower()==Name.ToLower()).SingleOrDefault();
if(category==null)返回true;
返回false;
}
}
正如您所看到的,我有
UniqueName(字符串名)
函数,但我如何传递ID,或者传递其中的整个模型,以便检查它是否与我试图编辑的模型的ID相同,然后传递。如何传递像
UniqueName(字符串名,int?id)
这样的内容?我今天才发现FluentValidation,但我不知道。

有一个重载,它接受带有两个参数(已验证对象和属性值)的谓词。在您的情况下,谓词将具有类型
Func
。因此,只需将
Category
参数添加到您的唯一名称验证方法:

private bool UniqueName(Category category, string name)
{
        ProjecteDataContext _db = new ProjecteDataContext();
        var dbCategory = _db.Categories
                            .Where(x => x.Name.ToLower() == name.ToLower())
                            .SingleOrDefault();

        if (dbCategory == null) 
            return true;

        return dbCategory.ID == category.ID;
}

旁注:您应该在处理完DbContext后立即将其处理掉,因此“使用(var _db=new ProjecteDataContext())”是否可以注入DbContext?@IshThomas简短的回答是“是的,您可以将上下文注入验证器”。考虑专门搜索注入验证器,您应该找到与之相关的答案。关于FluentValidation的文档也提到了如何做到这一点。
private bool UniqueName(Category category, string name)
{
        ProjecteDataContext _db = new ProjecteDataContext();
        var dbCategory = _db.Categories
                            .Where(x => x.Name.ToLower() == name.ToLower())
                            .SingleOrDefault();

        if (dbCategory == null) 
            return true;

        return dbCategory.ID == category.ID;
}