Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.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# 唯一属性的验证_C#_Asp.net_Asp.net Mvc 4 - Fatal编程技术网

C# 唯一属性的验证

C# 唯一属性的验证,c#,asp.net,asp.net-mvc-4,C#,Asp.net,Asp.net Mvc 4,我有必要验证数据库中是否已经存在值。因此,我编写了自己的ValidationAttribute来检查它。 问题是我将此添加到模型中的属性: [UniqueAttribute(ErrorMessage = "This title already exists")] 这在添加视图中工作正常,但在编辑此对象时,我不知道如何处理此问题,因为如果用户不更改标题,也会出现一条错误消息,因为验证已执行。 我可以使用没有此ValidationAttribute的modelview,但如果用户将标题更改为另一个

我有必要验证数据库中是否已经存在值。因此,我编写了自己的ValidationAttribute来检查它。 问题是我将此添加到模型中的属性:

[UniqueAttribute(ErrorMessage = "This title already exists")]
这在添加视图中工作正常,但在编辑此对象时,我不知道如何处理此问题,因为如果用户不更改标题,也会出现一条错误消息,因为验证已执行。 我可以使用没有此ValidationAttribute的modelview,但如果用户将标题更改为另一个仍然存在的标题,则会破坏唯一性

您知道如何验证编辑视图的标题在更新对象后是否唯一吗

多谢各位

例如:

public class UniqueAttribute : ValidationAttribute
{
    public override bool IsValid(object value)
    {
        if (value == null)
        {
            return true;
        }

        MyDataContext db = new MyDataContext();
        foreach (var item in db.AnyObjects.ToList())
            if (item.Title.Equals(value))
                return false;
        return true;
    }
}

这在添加对象时效果良好,但在编辑时效果不佳。

在模型中创建一个新属性,用于存储以前的(未更改或现有)标题。因此,在添加的情况下,它将是string.empty,在编辑的情况下,它将是未修改的标题值。在验证中使用反射将此属性与title属性进行比较。如果它们当时匹配(并且不是都是string.empty),那么这意味着用户编辑了记录,但没有更改标题,您的验证就通过了。如果它们不匹配,这意味着用户更改了标题,您可以检查数据库,如果用户输入的新标题已经存在。

您的
UniqueAttribute
属性的代码是什么?调用数据库,检查值是否在表中,如果是则返回true,如果不是则返回false。我的代码是正确的,我不需要更正它。我正在寻找正确的想法,然后我可以自己实现它。唯一简单的解决方案是在编辑视图中知道项目的id,并且您应该将id传递给UniqueAttribute,以便它可以检查标题是否正在使用。如果您可以共享UniqueAttribute类代码,我们有人可以更容易地帮助我如何获取标题属性在Validation类中,因为我使用上面的形式,并且IsValid方法只获取一个参数。使用validationcontext,您可以使用反射来获取另一个属性。查看此帖子:很抱歉,我不理解这篇文章。我不知道该怎么解决我的问题