【问题标题】:How can I keep ViewModel validation in sync with Model validation?如何使 ViewModel 验证与模型验证保持同步?
【发布时间】:2014-08-22 15:34:06
【问题描述】:

我使用的是实体框架代码优先方法,这意味着我的模型需要数据注释属性来创建数据库。我确实希望验证在我的模型上。

我的网站上有一些观点可以发布一些信息。但这些信息并不是整个模型,如果我要验证它,验证就会失败。

例如,我可以有一个具有这些 必需 属性的模型:TitleTextX... 但是我可以有一个视图,它只会发布Text。为此,我正在创建一个 ViewModel(其中还有其他未附加到模型的元素)。但是在这种情况下我将如何验证Text?我需要它与模型属性Text 具有相同的验证。

有没有办法在不重复代码的情况下对模型和视图模型进行相同的验证


这种尝试根本行不通……

我想创建一个自定义属性,将验证链接到模型:

/* This wouldn't work */
public class PropertyValidationAttribute : ValidationAttribute
{
    public Type Type { get; set; }

    public string PropertyName { get; set; }

    public PropertyValidationAttribute(Type type, string propertyName)
    {
        Type = type;
        PropertyName = propertyName;
    }

    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        var attrs = Type.GetProperty(PropertyName).GetCustomAttributes(typeof(ValidationAttribute), true) as IEnumerable<ValidationAttribute>;

        if (attrs != null)
        {
            foreach (var attr in attrs)
            {
                return attr.GetValidationResult(value, validationContext);
            }
        }

        return base.IsValid(value, validationContext);
    }
}

上面的问题是每个ValidationAttribute 一次只能验证一件事,所以如果我的模型上有多个验证属性,它将无法正常工作。而且我不确定它是否可以在客户端工作,我什至没有测试它......

【问题讨论】:

  • 我一定错过了什么。你说:“但是在这种情况下我将如何验证 Text?我需要它与模型属性 Text 具有相同的验证”。您需要在视图模型中复制的模型上有哪些验证?
  • 我需要在 ViewModel 中使用它才能使用客户端验证...
  • 你能把属性同时应用到模型和视图模型吗?还是您要避免的重复?

标签: c# asp.net-mvc validation ef-code-first asp.net-mvc-5


【解决方案1】:

虽然您当然可以制定解决方案,但您可能会编写大量代码以避免编写非常少量的代码。

有一些事情需要考虑。首先,EF 和 MVC 之间的某些验证并不相同。例如,EF 使用 MaxLength 和 MinLength,而 MVC 使用 StringLength。

其次,您将如何确定您真正想要和不想要的属性?

最后,实际上只有一个属性可以在.. 之间映射,这是必需的。如果您要使用属性进行复制...好吧,您刚刚创建的代码数量与 PLUS 编写的所有代码一样多来进行映射...

我只是接受微小的打击并在两个地方复制映射......

【讨论】:

    【解决方案2】:

    您可以在将模型映射到视图模型时使用反射来检查任何验证属性,然后将这些相同的属性应用于您的视图模型。假设您的模型和视图模型上的属性名称相同,您就可以创建一种方法来执行此操作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-31
      • 2017-02-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多