【发布时间】:2015-02-23 22:33:01
【问题描述】:
我现在在三个项目中遇到过这个问题。我有多个表单引用相同的数据字段,但显示不同。对于下面的示例,我正在通过创建新用户、编辑配置文件、登录等来更新或引用 AspNetUser 表。如果我尝试使用单个基本视图模型,我会遇到必填字段的问题。
例如,这里是用户名和密码/确认字段
[Required]
[RegularExpression(@"^[a-zA-Z0-9$$!%*#-_?&]*$", ErrorMessage = "The user name is invalid. Only letters, numbers, hyphens and underscores are allowed.")]
public string UserName { get; set; }
[Required]
[DataType(DataType.Password)]
[RegularExpression(@"^(?=.*[A-Z])(?=.[a-z])(?=.*\d)(?=.*[$@$!%*#?&])[A-Za-z\d$@$!%*#?&]{7,20}$",
ErrorMessage = "Password must contain a number, a lowercase character, an uppercase character, a special character and be between 7 and 20 characters in length.")]
[Display(Name = "Password")]
public string NewPassword { get; set; }
[Required]
[DataType(DataType.Password)]
[Display(Name = "Confirm Password")]
[Compare("NewPassword", ErrorMessage = "The new password and confirmation password do not match.")]
public string ConfirmPassword { get; set; }
显然从登录屏幕我不需要确认密码。在编辑个人资料页面中,您无法更新用户名。 我讨厌在多个地方使用相同的代码,如果密码或用户名的规则发生变化,我不想进入一堆视图模型来更新正则表达式。
有人有好的方法来处理这个吗?
【问题讨论】:
-
只是为了清楚你在说什么,当你有另一个视图并且在那个视图上你不呈现 ConfirmPassword 但是当你提交表单时它不会验证,因为这个字段 ConfirmPassword 是必需的. ?
-
你为什么不使用类继承,这样你就可以拥有从基类继承的特定模型,只需要说密码而不是确认,而另一个模型可以从两者继承。
-
一如既往,视图模型是解决方案。至于你担心更新多个正则表达式,创建继承
RegularExpressionAttribute并包含表达式的验证属性,例如PasswordAttribute(所以只有一段代码需要更新) -
不要使用
string作为密码。使用SecureString。 -
我同意@StephenMuecke。多视图模型是要走的路,如果你需要一个通用的验证属性,很容易编写一个自定义的。我也会避免类继承。您最终可能会遇到复杂的类层次结构,这会给您带来麻烦。
标签: c# asp.net-mvc asp.net-mvc-5 viewmodel