Я разрабатываю приложение ASP.NET MVC, и я пришел в довольно неловкую ситуацию.ViewModels и модели домена в ASP.NET MVC
У меня есть страница, где пользователь может искать некоторые предметы (скажем, студенты) по некоторым критериям. Я использовал, чтобы передать коллекцию студентов на мой взгляд, но потом я добавил некоторые параметры поиска, поэтому я решил создать ViewModel следующий
public class SearchViewModel
{
public string SearchString { get; set; }
public bool IsCaseSensitive { get; set; }
...
//other parameters
...
public IEnumerable<Student> Students { get; set; }
}
Тогда я думал о ситуации, когда я необходимо добавить дополнительную информацию каждому учащемуся, который не хранится в базе данных и генерируется на контроллере. Моя первая мысль была совершенно идиотской - я добавил дополнительный массив, чтобы сохранить его в ViewModel, как это:
public class SearchViewModel
{
public string SearchString { get; set; }
public bool IsCaseSensitive { get; set; }
...
//other parameters
...
public IEnumerable<Student> Students { get; set; }
public IEnumerable<int> someData { get; set; }
}
Таким образом, чтобы получить данные, код клиента должен получить позицию студентов в массив, а затем перейдите в соответствующую позицию в массиве someData.
Мне не очень понравилась эта идея, поэтому я изменил свою модель, состоящую из параметров поиска + дополнительную модель для хранения как объекта-ученика, так и их данных.
public class SearchViewModel
{
public string SearchString { get; set; }
public bool IsCaseSensitive { get; set; }
...
//other parameters
...
public IEnumerable<StudentViewModel> StudentModels { get; set; }
}
public class StudentViewModel
{
public Student Student { get; set; }
public int someData { get; set; }
}
Это прекрасная идея для создания таких моделей 'помощников', как StudentViewModel? Я бы, вероятно, не использовал StudentViewModel нигде, кроме внутри SearchViewModel. Учитывая, что SearchViewModel является своеобразной моделью «помощи», создание другой модели, используемой только внутри SearchViewModel, кажется немного странным. Это так?
Насколько я понял, ViewModel никогда не должен содержать модель домена. Должен ли я делить свойство Студент на более мелкие свойства? Например, как это:
public class StudentViewModel { public string Name { get; set; } public int GroupId { get; set; } public int someData { get; set; } }
В общем, как я понял, модель представления должна состоять только примитивов и их коллекций (и, возможно, другие ViewModels как в первом вопросе). Правильно ли это?
Спасибо. Единственное, что я не совсем понял, это ваш третий ответ. Ссылаясь на ваш второй ответ, я не должен использовать любую модель домена (обычный Student, а не StudentViewModel) в своих представлениях. Тем не менее, тогда вы говорите, что я действительно должен использовать свой класс учеников. Правильно ли я понял, что лучший способ состоит в том, чтобы 1) сохранить модель домена Student как есть и 2) использовать StudentViewModel для нужд представлений вместо того, чтобы делить его на разные свойства? Кроме того, мне не очень нравятся условия DTO. Могут ли мои ViewModels рассматриваться как DTO? –