我有一个视图模型,在这个模型中有3到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)
我能想到的三个选择:
ValidationAttribute
(通过覆盖IsValid(Object, ValidationContext)
方法,或依赖静态方法/属性中的其他上下文信息。例如,如果请求来自某个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类继承。我认为随着系统的发展,你可能会遇到一个场景,你的抽象类需要大量修改,因此,如果我是你,我会创建更多的视图模型,即使代码看起来是重复的。从长远来看,您将受益,因为您将能够以尽可能小的副作用修改部分应用程序。