mvc 3.0中的验证规则

时间:2011-10-10 04:38:35

标签: asp.net-mvc-3

我有一个视图模型,在这个模型中有3到4个视图很常见我也定义了验证规则。现在的问题是,在其中一个视图中我要覆盖两到三个字段的视图模型验证规则。所以我所做的?我不想为该视图制作新的视图模型。

4 个答案:

答案 0 :(得分:3)

从MVC架构的角度来看 - 这是完全您使用视图模型的原因。 您应该为每个案例创建单独的视图模型。使用automapper(在codeplex上免费提供)可以在视图模型和实体之间复制值。

甚至不考虑不同的方式,继承等 - 这就是ViewModels的用途。

答案 1 :(得分:1)

我的建议基本上是你不想要的:创建新的模型类,但使用继承来避免重复你想要的属性。如果您坚决反对创建单独的模型,您可以考虑实现IValidatableObject并在验证您希望改变的属性之前检查其他属性。

修改: 我不同意Tuliper的回答,但为了充实我的建议,考虑一个你想要保存用户数据的场景。从一种形式,您正在创建一个用户;从另一个,你只是更新(这有点拉伸,但它是为了说明的目的)。 “创建”表单可能需要引用用户的人的姓名,而“更新”表单可能不需要。

使用继承,您可以执行以下操作:

public class SaveUserModel
{
    public int? UserId { get; set; }

    ...
}

public class CreateUserModel : SaveUserModel
{
    [Required]
    public string ReferredByName { get; set; }
}

使用IValidatableObject,你可以这样做:

public class SaveUserModel : IValidatableObject
{
    public int? UserId { get; set; }

    public string ReferredByName { get; set; }

    ...

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        // if UserId is null, we are creating a user vs. updating
        if (UserId != null && string.IsNullOrWhiteSpace(ReferredBySiteUrl))
            yield return new ValidationResult("Please specify the name of the person who referred you.", new[] { "ReferredByName" });
    }
}

重申一下,我并非试图推动我的回答。如果它们在不同的视图中完全相同,我倾向于重用模型,但通常有足够的差异来保证简单地创建单独的模型。最后,在这种情况下,通过坚持DRY减轻任何感知到的技术债务都会有所收获;模型往往易于维护。

答案 2 :(得分:1)

我能想到的三个选择:

  1. 使用AutoMapper创建一个单独的ViewModel来处理一些繁重的工作。
  2. 创建一个具有不同验证规则的子类。
  3. 创建一个对上下文敏感的自定义ValidationAttribute(通过覆盖IsValid(Object, ValidationContext)方法,或依赖静态方法/属性中的其他上下文信息。
  4. 例如,如果请求来自某个URL,则会忽略此必需验证属性:

    public class CustomRequiredAttribute : RequiredAttribute
    {
        public override bool IsValid(object value)
        {
            if (HttpContext.Current.Request.Url != "urlwhennotrequired")
                return base.IsValid(value);
            return true;
        }
    }
    

答案 3 :(得分:1)

如果你继续使用继承,那么请确保从abstract类继承。我认为随着系统的发展,你可能会遇到一个场景,你的抽象类需要大量修改,因此,如果我是你,我会创建更多的视图模型,即使代码看起来是重复的。从长远来看,您将受益,因为您将能够以尽可能小的副作用修改部分应用程序。