首页 新闻 会员 周边 捐助

mvc3+EF 中model字段定义问题

0
悬赏园豆:5 [已解决问题] 解决于 2012-11-27 14:10

比如注册会员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这个字段,否则出错,这样不是多余吗?如何避免?

红尘中迷茫的主页 红尘中迷茫 | 初学一级 | 园豆:60
提问于:2012-11-22 17:36
< >
分享
最佳答案
0

问这个问题前,请说明你使用的是Code-First,Model-First,又或是Db-First模式。

收获园豆:5
Launcher | 高人七级 |园豆:45050 | 2012-11-22 17:50

我是按照 ASP.NET MVC 音乐商店 案例做的,刚开始研究mvc3,怎么看模式?

红尘中迷茫 | 园豆:60 (初学一级) | 2012-11-22 17:58

应该是Code-First

红尘中迷茫 | 园豆:60 (初学一级) | 2012-11-22 23:08

@红尘中迷茫: 如果是Code-First的话,因为ConfimPassword是引用类型,所以允许为null,那么只要不设置IsRequired,则数据库中可以没有这个字段。

Launcher | 园豆:45050 (高人七级) | 2012-11-23 09:09

@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();
红尘中迷茫 | 园豆:60 (初学一级) | 2012-11-23 12:34

@红尘中迷茫: 我等于是在帮你读代码,不是解决技术问题。你翻下代码哪里有对ConfimPassword的验证不就行了。

Launcher | 园豆:45050 (高人七级) | 2012-11-23 13:23

@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;
        } 
红尘中迷茫 | 园豆:60 (初学一级) | 2012-11-27 13:09

@红尘中迷茫: 因为 ConfirmPassword 有这个特性:[Compare("Password", ErrorMessage = "密码和确认密码不匹配")]
所以会触发验证,此问题的根源本质上来说,是你没有区分Model和ViewModel,ConfirmPassword应该是ViewModel的属性,而不是Model的属性,如果将User分别定义为:UserModel和UserViewModel,则可解决此问题,但是从MVVM的角度来讲,在注册页面上使用的应该是 RegisterViewModel,而不是UserViewModel。因此,正确的做法是:定义 UserModel(不包含ConfirmPassword)用于领域模型,定义 RegisterViewModel(包含注册需要的所有字段)用于视图模型。

凡是遇到Model与ViewModel不匹配的场景时,你都应该考虑将其划分开来。

Launcher | 园豆:45050 (高人七级) | 2012-11-27 13:26

@Launcher: 嗯,就是这个问题了,刚用MVC定义多个Model总是不习惯,想整合一起,结果怪问题多多。看来只能分解了。非常感谢你的耐心回答!

红尘中迷茫 | 园豆:60 (初学一级) | 2012-11-27 14:09
其他回答(2)
0

数据库 为什么要加这个字段呢? 可以不映射啊

Qlin | 园豆:2403 (老鸟四级) | 2012-11-22 17:54

怎么做?

支持(0) 反对(0) 红尘中迷茫 | 园豆:60 (初学一级) | 2012-11-22 18:05

@红尘中迷茫:

 [NotMapped]

public string ConfirmPassword

支持(0) 反对(0) Qlin | 园豆:2403 (老鸟四级) | 2012-11-23 09:38

@Qlin: 加[NotMapped]可以不用映射了,可是其他与会员有关的操作,例如添加评论,居然要把会员数据都验证一遍,数据库中没有ConfirmPassword就提示验证出错。

支持(0) 反对(0) 红尘中迷茫 | 园豆:60 (初学一级) | 2012-11-27 13:13

@红尘中迷茫: 

你的 UI使用的 model 和数据库里 用两套

支持(0) 反对(0) Qlin | 园豆:2403 (老鸟四级) | 2012-11-27 13:18
0

是不是应该在那个自动生成的.edmx中的有一个实体类中应该是自动生成了这个属性

chenping2008 | 园豆:9836 (大侠五级) | 2012-11-22 21:22

没有.edmx文件

支持(0) 反对(0) 红尘中迷茫 | 园豆:60 (初学一级) | 2012-11-22 23:08
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册