Я прочитал пару сообщений об использовании ViewModel в ASP.net MVC и понял, что он отличается от ViewModel в шаблоне M-V-VM.
ViewModel используется, чтобы избежать прямого доступа к модели из View, но хорошо ли иметь свойства типа (определенные на уровне модели) в ViewModel? Это означает, что в конечном итоге нам нужно включить пространство имен модели в ViewModel.
E.g.
Модель
1. Сущность YesNoTBDValue / класс POCO
public partial class YesNoTBDValue
{
public int Id { get; set; }
public string Name { get; set; }
}
2 Класс YesNoTBDValue, используемый в сущности Project (определен в самой модели)
public partial class Project
{
public virtual YesNoTBDValue IsAvailable { get; set; }
}
Просмотр модели
1. ProjectEditViewModel
public class ProjectEditViewModel
{
HERE TO INCLUDE YesNoTBDValue CLASS, I NEED TO INCLUDE MODELS
OR THERE IS BETTER WAY?
public List<YesNoTBDValue> YesNoTBDValues { get; set; }
public int IsAvailableSelectedItemId { get; set; }
}
Контроллер
Контроллер проекта (в действии редактирования, создающем новый экземпляр модели представления)
ProjectEditViewModel projectEditViewModel = new ProjectEditViewModel
{
YesNoTBDValues = db.YesNoTBDValues.ToList()
};
Просмотр
Отображение DropDownList из списка YesNoTBDValues и сохранение выбранного элемента в IsAvailableSelectedItemId
@Html.DropDownList("IsAvailableSelectedItemId ",
new SelectList(Model.YesNoTBDValues, "Id", "Name",
Model.IsAvailableSelectedItemId ))
Пожалуйста, посоветуйте мне, как это должно быть правильно закодировано.
Повторяющийся вопрос: должна ли ViewModel включать пространство имен модели? В моем примере YesNoTBDValue определено в модели, и для его использования я использую пространство имен модели.
/ ДРУГОЙ ПОДХОД /
Не удовлетворенный своим существующим подходом, я загрузил исходный код Microsoft Nuget Gallery с github и понял, что они никогда не использовали МОДЕЛИ внутри VIEWMODEL, что для меня имеет смысл. Я немного изменил приведенный выше код (, чтобы удалить ссылку на модель из ViewModel) и обнаружил, что он отлично работает.
Вот мои изменения:
Модель Без изменений, как есть
Просмотр модели
1. Создайте копию класса YesNoTBDValue, скажите YesNoTBDValueViewModel.
public class YesNoTBDValueViewModel
{
public int Id { get; set; }
public string Name { get; set; }
}
2 Используйте эту модель просмотра в ProjectEditViewModel и удалите ссылку на модель.
public class ProjectEditViewModel
{
public List<YesNoTBDValueViewModel> YesNoTBDValues {get;set;}
public int IsAvailableSelectedItem {get;set;}
}
Контроллер Измените способ заполнения этих значений. (В действии редактирования)
ProjectEditViewModel projectEditViewModel = new ProjectEditViewModel
{
YesNoTBDValues = db.YesNoTBDValues.Select(
x => new LMSPriorTool.ViewModels.YesNoTBDValueVM
{
Id = x.Id,
Name = x.Name
}).ToList()
}
И обнаружил, что после этих изменений он тоже работает нормально. Мне нравится этот второй подход, так как в нем Модели и ViewModels полностью отделены друг от друга. Оставляем этот вопрос открытым для дальнейшего обсуждения.
Пожалуйста, пролейте свет, если мне что-то здесь не хватает.