MVC EF Использование табличного представления для заполнения ViewModel - PullRequest
0 голосов
/ 19 ноября 2018

Мне сложно сформулировать этот вид, поскольку я только начал C # несколько месяцев назад, и сейчас я создаю веб-сайт в ASP.NET, используя модель MVC и бритвенные страницы и Entity Framework, а также использую хранимые процедуры и представления вмоя база данныхВсе совершенно новые элементы и относительно небольшая помощь онлайн для тех, кому приходится собирать разные ответы.До сих пор это работало нормально, но в настоящее время мне нужно создать IEnumerable версию существующей ViewModel на основе sql View.

Причина довольно проста, и может существовать другое решение. Я получил следующее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)]

Для отображения только ДАТЫ на странице индексавместо ДАТА: 00: 00: 00

Теперь это работает на странице сведений, однако способ, которым я сделал свой контроллер для индекса, выглядит так:

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

Так что это конечно нене использую davalidation на странице индекса.

По сути, я хочу сделать следующее:

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

Что, очевидно, не работает из-за разных классов, но я 'Я не совсем уверен, как добиться желаемого результата.Я посмотрел в AutoMapper, но я не совсем понимаю.

Я изучил цикл foreach, но с моим минимальным опытом работы с IEnumeralbe я не уверен, как к этому подойти, так как я не могу создать абстрактный IList или IEnumerable моей TimeRegistrationViewModel:

И, как уже упоминалось, я не уверен, смогу ли я применить проверку данных в другом месте.Самое простое место было бы в сущности VI_TimeRegistration, но это внутри Entity Frame и поэтому переопределяется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...