【问题标题】:Validation for unique attributes验证唯一属性
【发布时间】:2015-06-12 12:56:24
【问题描述】:

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

[UniqueAttribute(ErrorMessage = "This title already exists")]

这在添加视图中工作正常,但在编辑此对象时我不知道如何处理,因为如果用户不更改标题,也会出现错误消息,因为执行了验证。 我可以使用没有此 ValidationAttribute 的模型视图,但如果用户将标题更改为另一个仍然存在的标题,则会破坏唯一性。

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

谢谢。

示例:

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

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

【问题讨论】:

  • UniqueAttribute 属性的代码是什么?
  • 调用数据库,检查值是否在表中,如果是则返回true,否则返回false。
  • 我的代码是正确的,我不需要更正它。我正在寻找正确的想法,然后我可以自己实现它。
  • 唯一直接的解决方案是在编辑视图中知道项目的 id,你应该将 id 传递给 UniqueAttribute 以便它可以检查标题是否被使用
  • 如果您可以分享 UniqueAttribute 类代码,我们可以更轻松地提供帮助

标签: c# asp.net asp.net-mvc-4


【解决方案1】:

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

【讨论】:

  • 如何在Validation Class中获取title属性,因为我使用上面的形式,而IsValid方法只获取一个参数。
  • 使用验证上下文可以使用反射来获取其他属性。查看这篇文章:stackoverflow.com/questions/6075339/…
  • 很抱歉我没看懂这篇文章。我不知道如何解决我的问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-15
  • 2014-09-20
  • 2011-03-17
相关资源
最近更新 更多