模型列表到控制器中的视图模型列表

本文关键字:模型 列表 视图 控制器 | 更新日期: 2023-09-27 18:34:26

我有一个DBContext"StatusDBContext",一个带有一些(n)属性的模型"Status_T"和一个具有很少模型属性的相应ViewModel"Status"。我首先使用实体框架和数据库中的代码。

DBContext:

namespace xxx.Areas.SysParam.Models
{
    using System;
    using System.Data.Entity;
    using System.ComponentModel.DataAnnotations.Schema;
    using System.Linq;
    public partial class StatusDbContext : DbContext
    {
        public StatusDbContext()
            : base("name=xxxConnectionString")
        {
        }
        public virtual DbSet<STATUS_T> STATUS_T { get; set; }
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Entity<STATUS_T>().ToTable("STATUS_T");
        }
    }
}

型:

namespace xxx.Areas.SysParam.Models
{
    using System;
    using System.Collections.Generic;
    using System.ComponentModel.DataAnnotations;
    using System.ComponentModel.DataAnnotations.Schema;
    using System.Data.Entity.Spatial;
    [Table("STATUS_T")]
    public partial class STATUS_T
    {
        [Key]
        [Column(Order = 0)]
        [StringLength(35)]
        public string TYPE { get; set; }
        [Key]
        [Column(Order = 1)]
        public byte STATUS { get; set; }
        [StringLength(30)]
        public string DESCRIPTION { get; set; }
        [Key]
        [Column(Order = 2)]
        [StringLength(2)]
        public string LANG_CODE { get; set; }
        public DateTime UPD_DTIME { get; set; }
        public DateTime? DELETE_DTIME { get; set; }
        public short? VER_NO { get; set; }
        [StringLength(1)]
        public string STAT_USE { get; set; }
    }
}

查看模型:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using xxx.Areas.SysParam.Models;
namespace xxx.Areas.SysParam.ViewModels
{
    public class Status
    {
        [Display(Name = "Status ID")]
        public byte STATUS { get; set; }
        [Display(Name = "Description")]
        public string DESCRIPTION { get; set; }
        [Display(Name = "Type")]
        public string TYPE { get; set; }
        [Display(Name = "In Use")]
        public string STAT_USE { get; set; }
    }
}

在引入 ViewModel 之前,控制器如下所示:

public ActionResult StatusView()
{
    List<Models.STATUS_T> StatusList = new List<Models.STATUS_T>();
    using (var status = new Models.StatusDbContext())
    {
        StatusList = Status.STATUS_T.ToList();
    }
    return View(StatusList);
}

现在我有两个问题。

1)当我在谷歌上搜索模型,视图模型和数据注释时,很明显应该将DataAnnotations添加到ViewModel中,但是在现有数据库的代码优先中,模型是用很少的数据注释生成的,那么这里的最佳实践是什么,将属性从模型复制到ViewModel并在需要时添加更多DataAnnotation?

2) 如何在控制器代码中用视图模型替换模型?

帮助将不胜感激。谢谢!!!

更新: 控制器:

public ActionResult DWPStatusView()
{
    var DWPStatusList = new List<ViewModels.DWPStatus>();
    using (var DWPStatus = new Models.DWPStatusDbContext())
    {
        DWPStatusList = DWPStatus.DWP_STATUS_T.ToList().Select(p => new ViewModels.DWPStatus(p)).ToList();
    }
    return View(DWPStatusList);
}

模型列表到控制器中的视图模型列表

1.是的,最佳做法是创建单独的视图模型类并从数据库模型中复制必要的属性,因为:

  • 可能发生数据库模型具有不需要的视图属性的情况
  • 视图模型可能需要其他属性并将其添加到数据库模型不是好的做法

视图模型通常具有验证数据注释属性,因此最好将它们也与数据库注释分开。

阿拉伯数字。

public ActionResult StatusView()
{
    var statusList = new List<ViewModels.Status>();
    using (var status = new Models.StatusDbContext())
    {
        statusList = Status.STATUS_T.ToList().Select(p => new ViewModels.Status {
            Property1 = p.Property1,
            Property2 = p.Property2,
            ...
        }).ToList();
    }
    return View(statusList);
}

您可以将属性映射放入视图模型构造函数中,然后选择数据将如下所示:

statusList = Status.STATUS_T.ToList().Select(p => new ViewModels.Status(p)).ToList();

更新:和视图模型:

public class Status
{
    public Status(){}
    public Status(Models.STATUS_T model)
    {
        //here comes mapping
    }
    ....
}