加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc – MVC架构 – 重新使用相同的viewmodel进行读取和

发布时间:2020-12-16 06:59:09 所属栏目:asp.Net 来源:网络整理
导读:假设我们有以下(过于简单)的场景: 我们有一个屏幕来查看人员详细信息和一个屏幕来编辑人员详细信息. 屏幕显示人员详细信息具有以下字段(仅显示): 名字 姓 生物 屏幕编辑人员详细信息显示有以下字段(在输入控件中): ID(隐藏) 名字 姓 生物 假设我们的显示
假设我们有以下(过于简单)的场景:

我们有一个屏幕来查看人员详细信息和一个屏幕来编辑人员详细信息.

屏幕显示人员详细信息具有以下字段(仅显示):

名字

生物

屏幕编辑人员详细信息显示有以下字段(在输入控件中):

ID(隐藏)
名字

生物

假设我们的显示视图模型如下所示:

public class DisplayPersonViewModel
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string Bio { get; set; }
    }

我们的编辑视图模型如下所示:

public class EditPersonViewModel
{
    [Required]
    public int ID { get; set; }

    [Required]
    [StringLength(20)]
    public string FirstName { get; set; }

    [Required]
    [StringLength(20)]
    public string LastName { get; set; }

    [Required]
    public string Bio { get; set; }
}

2,呃之间差别不大?编辑模型在属性上有一个额外字段(ID)和一些属性.现在,如果我们要像这样结合2:

public class DisplayPersonViewModel
    {
        [Required]
        [StringLength(20)]
        public string FirstName { get; set; }

        [Required]
        [StringLength(20)]
        public string LastName { get; set; }

        [Required]
        public string Bio { get; set; }
    }

    public class EditPersonViewModel : DisplayPersonViewModel
    {
        [Required]
        public int ID { get; set; }
    }

这当然更干,因为我们没有要维护的重复字段,但现在我们在显示视图模型上有无关的信息(属性).无论如何,我更倾向于第二种方法,因为我们的一些屏幕有超过25个字段! (……那是我无法控制的,所以请不要竖起来:) :)但是,我只是想听听意见,以便更好地了解可能是“最佳实践”.

解决方法

是的,第二种方法对我来说似乎没问题.不用担心,除了你肚子里的这种痒感,告诉你为什么你在装修一个带有验证属性的显示视图模型.但是如果你可以忍受它,那么与复制视图模型相比,它确实是首选.

不幸的是,我个人无法忍受这种感觉,这就是为什么我使用FluentValidation.NET来定义我的验证规则而不是数据注释.它允许我将这些规则与我的视图模型分开,然后我不担心用验证规则污染所谓的显示视图模型.所以我将以与2个视图模型相同的方式定义,EditPersonViewModel将从DisplayPersonViewModel派生,然后在单独的类中为EditPersonViewModel定义我的EditPersonViewModelValidator.

哦和旁注:没有必要使用[Required]属性装饰不可为空的类型.所有非可空类型都是其基本性质所必需的.所以代替:

[Required]
public int ID { get; set; }

你应该只有:

public int ID { get; set; }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读