比如注册会员Model
[Required(ErrorMessage = "请输入您的密码")] [StringLength(100, ErrorMessage = "密码的长度必须大于6个字符。", MinimumLength = 6)]
public string Password { get; set; }
[DisplayName("确认密码")] [Required, Compare("Password", ErrorMessage = "密码和确认密码不匹配")]
public string ConfirmPassword { get; set; }
数据库中也必须有ConfirmPassword这个字段,否则出错,这样不是多余吗?如何避免?
问这个问题前,请说明你使用的是Code-First,Model-First,又或是Db-First模式。
我是按照 ASP.NET MVC 音乐商店 案例做的,刚开始研究mvc3,怎么看模式?
应该是Code-First
@红尘中迷茫: 如果是Code-First的话,因为ConfimPassword是引用类型,所以允许为null,那么只要不设置IsRequired,则数据库中可以没有这个字段。
@Launcher: 加上[NotMapped],Required也去掉了,数据库中把这个字段删掉,也可以注册会员了。写到其他代码时,出了新的问题。
public class Comment
{
[Key]
public int CommentId {
get;
set;
}
[MaxLength(500)]
public string Content {get;set;}
public int UserId {get; set; }
[ForeignKey("UserId")]
public virtual User UserInfo { get; set; }
有会员评论功能,发布评论,如何也不成功,加了try{}catch{}调试,居然发现又是ConfimPassword的问题,在添加Comment时,居然要把会员注册信息都验证一遍,然后提示ConfimPassword值和Password不同,在会员表里加上ConfimPassword,并把值设置为Password相同后,评论成功!怪异呀。
添加评论的代码片段:
[Authorize(Roles = "User")] [HttpPost] public ActionResult AddComment(Comment model) { if (ModelState.IsValid) { User user=userRepository.Get(User.Identity.Name); if (user != null) { User user=userRepository.Get(User.Identity.Name); if (user != null) { try { model.UserInfo = user; model.CreatedAt = DateTime.Now; model.LastModified = DateTime.Now; commentRepository.Add(model); commentRepository.Save();
@红尘中迷茫: 我等于是在帮你读代码,不是解决技术问题。你翻下代码哪里有对ConfimPassword的验证不就行了。
@Launcher: 评论页面里没有需要验证ConfimPassword的地方,验证产生于注册会员页面,是在Model里定义的,为什么添加评论也要顺便验证ConfimPassword?这个问题很奇怪了,网上没找到注册会员的MVC3例子,微软的案例是分别写Model,使用Membership。
[DataType(DataType.Password)] [Required(ErrorMessage = "请输入您的密码")] [StringLength(100, ErrorMessage = "密码的长度必须大于6个字符。", MinimumLength = 6)] public string Password { get; set; } [DataType(DataType.Password)] [DisplayName("确认密码")] [Compare("Password", ErrorMessage = "密码和确认密码不匹配")] public string ConfirmPassword { get; set; }
@红尘中迷茫: 因为 ConfirmPassword 有这个特性:[Compare("Password", ErrorMessage = "密码和确认密码不匹配")]
所以会触发验证,此问题的根源本质上来说,是你没有区分Model和ViewModel,ConfirmPassword应该是ViewModel的属性,而不是Model的属性,如果将User分别定义为:UserModel和UserViewModel,则可解决此问题,但是从MVVM的角度来讲,在注册页面上使用的应该是 RegisterViewModel,而不是UserViewModel。因此,正确的做法是:定义 UserModel(不包含ConfirmPassword)用于领域模型,定义 RegisterViewModel(包含注册需要的所有字段)用于视图模型。
凡是遇到Model与ViewModel不匹配的场景时,你都应该考虑将其划分开来。
@Launcher: 嗯,就是这个问题了,刚用MVC定义多个Model总是不习惯,想整合一起,结果怪问题多多。看来只能分解了。非常感谢你的耐心回答!
数据库 为什么要加这个字段呢? 可以不映射啊
怎么做?
@红尘中迷茫:
[NotMapped]
public string ConfirmPassword
@Qlin: 加[NotMapped]可以不用映射了,可是其他与会员有关的操作,例如添加评论,居然要把会员数据都验证一遍,数据库中没有ConfirmPassword就提示验证出错。
@红尘中迷茫:
你的 UI使用的 model 和数据库里 用两套
是不是应该在那个自动生成的.edmx中的有一个实体类中应该是自动生成了这个属性
没有.edmx文件