MVC EF使用表格视图填充ViewModel

时间:2018-11-19 12:04:21

标签: c# sql asp.net-mvc entity-framework

几个月前刚开始使用C#时,我发现很难用这种语言来表达,现在我正在使用MVC模型,剃刀页面和实体框架在ASP.NET中创建一个网站,同时还在其中使用存储过程和视图我的数据库。所有全新的要素,并且对于专业人士而言,在网上提供的帮助相对较少,必须将不同的答案拼凑在一起。到目前为止,一切正常,但是我目前需要基于sql视图创建现有ViewModel的IEnumerable版本。

原因很简单,可能存在另一个解决方案,我有以下ViewModel:

public class TimeRegistrationViewModel
{
    public int PK_Id { get; set; }
    [Required]
    public int FK_UserId { get; set; }
    [Required]
    public int FK_ProjectId { get; set; }
    [Required]
    public int FK_TaskId { get; set; }
    [Required]
    public int Time { get; set; }
    [Required]
    [DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}", ApplyFormatInEditMode = true)]
    public System.DateTime Date { get; set; }
    [Required]
    [DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}", ApplyFormatInEditMode = true)]

    public System.DateTime DateEntry { get; set; }
    public string TaskTypeName { get; set; }
    public string ProjectName { get; set; }
    public string UserName { get; set; }
    public List<TimeReg.VI_TimeRegistration> VI_TimeRegistration_List { get; set; }
    public TimeRegistrationViewModel() { }
    //Overload created for shorter controller code when assigned the values of View to a ViewModel
    public TimeRegistrationViewModel(VI_TimeRegistration viTimeRegistration)
    {
        PK_Id = viTimeRegistration.PK_Id;

        FK_UserId = viTimeRegistration.FK_UserId;
        FK_ProjectId = viTimeRegistration.FK_ProjectId;
        FK_TaskId = viTimeRegistration.FK_TaskId;
        Time = viTimeRegistration.Time;
        Date = viTimeRegistration.Date;
        DateEntry = viTimeRegistration.DateEntry;
        TaskTypeName = viTimeRegistration.TaskTypeName;
        ProjectName = viTimeRegistration.ProjectName;
        UserName = viTimeRegistration.UserName;
    }

    public TimeRegistrationViewModel(List<TimeReg.VI_TimeRegistration> list)
    {
        VI_TimeRegistration_List = list;
    }
}

}

如您所见,它使用以下数据验证方法:

DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}", ApplyFormatInEditMode = true)]

为了仅在索引页面上显示DATE而不是DATE:00:00:00

现在这在详细信息页面下有效,但是我制作索引控制器的方式如下:

   public ActionResult Index()
    {
        var timeRegistrationViewModel = new TimeRegistrationViewModel(db.VI_TimeRegistration.ToList());
        return View(timeRegistrationViewModel);
    }

因此,这当然不使用索引页上的数据验证。

我想做的本质上是

    public ActionResult Index()
    {
        IEnumerable<TimeRegistrationViewModel> timeRegistrationViewModel = new TimeRegistrationViewModel(db.VI_TimeRegistration);
        return View(timeRegistrationViewModel);
    }

由于类的不同,这显然不起作用,但是我不太确定如何实现所需的结果。我已经研究过AutoMapper,但我不太了解。

我已经研究了一个foreach循环,但是由于我对IEnumeralbe的基本了解,我不确定如何处理此问题,因为我无法创建TimeRegistrationViewModel的抽象IList或IEnumerable:

如上所述,我不确定是否可以在其他地方应用数据验证。最简单的位置在VI_TimeRegistration实体上,但是它位于Entity Frame内,因此将被覆盖。

0 个答案:

没有答案