【发布时间】:2010-04-05 17:26:10
【问题描述】:
如果我们需要支持另一个数据存储,我的应用程序设计实现了存储库模式,并且我的代码为将来可选的依赖注入做好了准备。
我想为我的内容对象创建一个自定义验证属性。该属性应该执行某种数据存储查找。例如,我需要我的内容有独特的 slug。要检查 Slug 是否已经存在,我想在我的 Base 内容对象中使用自定义 DataAnnotation 属性(而不是每次在我的控制器的 Insert 操作中手动检查是否存在 slug)。属性逻辑将进行验证。
到目前为止,我想出了这个:
public class UniqueSlugAttribute : ValidationAttribute
{
private readonly IContentRepository _repository;
public UniqueSlugAttribute(ContentType contentType)
{
_repository = new XmlContentRepository(contentType);
}
public override bool IsValid(object value)
{
if (string.IsNullOrWhiteSpace(value.ToString()))
{
return false;
}
string slug = value.ToString();
if(_repository.IsUniqueSlug(slug))
return true;
return false;
}
}
我的基本内容类的一部分:
...
[DataMember]
public ContentType ContentType1 { get; set; }
[DataMember]
[Required(ErrorMessageResourceType = typeof (Localize), ErrorMessageResourceName = "Validation_SlugIsBlank")]
[UniqueSlug(ContentType1)]
public string Slug
{
get { return _slug; }
set
{
if (!string.IsNullOrEmpty(value))
_slug = Utility.RemoveIllegalCharacters(value);
}
}
...
一行有错误
[UniqueSlug(ContentType1)]
说:“属性参数必须是属性参数类型的常量表达式、typeof表达式或数组创建表达式。”
让我解释一下,我需要将 ContentType1 参数提供给 UniqueSlug 类的构造函数,因为我在数据提供程序中使用它。
如果您尝试对内置的Required属性执行此操作,实际上会出现相同的错误:
[Required(ErrorMessageResourceType = typeof (Localize), ErrorMessageResourceName = Resources.Localize.SlugRequired]
它不允许我们将其设置为动态内容。在第一种情况下 ContentType1 在运行时获知,在第二种情况下 Resources.Localize.SlugRequired 在运行时也获知(因为文化设置是在运行时分配的)。
这真的很烦人,让很多事情和实现场景变得不可能。
那么,我的第一个问题是,如何摆脱这个错误? 我的第二个问题是,您是否认为我应该以任何方式重新设计我的验证代码?
【问题讨论】:
标签: asp.net-mvc validation data-annotations