Должен ли я всегда использовать модель представления или можно использовать ViewData?
Как вы думаете, когда лучше использовать ViewData поверх модели представления?
У меня точно такой же частичный вид в нескольких основных видах. Я хотел бы контролировать, как отображается частичное представление, но я бы также предпочел, чтобы частичное представление принимало только модель представления, представляющую собой набор записей, просто IEnumerable<>
объект. Я бы предпочел не отправлять объект модели полного представления из основного представления, поскольку он также содержит множество различных свойств, объектов, которые управляют подкачкой, сортировкой, фильтрацией и т. Д.
Поэтому вопрос заключается в том, должен ли я создать другую модель представления для частичного представления или можно использовать ViewData? Я читал где-то, что с помощью ViewData
это очень плохая практика.
С View Data я мог бы просто передать требуемые детали, как это:
@{
ViewDataDictionary vd = new ViewDataDictionary
{
new KeyValuePair<string,object>("WithDelete", Model.WithDelete),
new KeyValuePair<string,object>("WithRadarCode", Model.WithCode)
};
}
// ...
@if (Model != null) {
Html.RenderPartial("_ListOfRecordingsToRender", Model.recordingViewModel, vd);
}
На данный момент было бы разобраться.
Я беспокоюсь, что в настоящее время это *.recordingViewModel
В моем проекте много разных вариаций из-за разных моделей создания / редактирования, листинга, просмотра деталей записи и т. д. Я чувствую, что в моем проекте это может стать слишком грязным, если я создаю модель представления для каждого действия.
Как вы думаете. Пожалуйста, не могли бы вы дать совет по этой конкретной проблеме. Спасибо
1 ответ
Я думаю, вы должны придерживаться ViewModel
, ваш ViewModel
это класс, который определяет ваши требования к представлению.
Моя причина в том, что в долгосрочной перспективе это будет намного более ремонтопригодным. Когда используешь ViewBag
это dynamic
класс, так что, по вашему мнению, вы должны проверить, если ViewBag
свойство существует (и может привести к глупым ошибкам типа опечаток), например:
if(ViewBag.PropertyName != null)
{
// ViewBag.PropertyName is a different property to ViewBag.propertyName
}
Этот тип кода может сделать ваш вид довольно грязным. Если вы используете строго типизированную модель, вы должны быть в состоянии поместить большую часть логики в свои контроллеры и поддерживать представление как можно более чистым, что является большим плюсом в моих книгах.
Вы также будете в конечном итоге (если вы используете ViewBag
) пытаясь поддерживать его в какой-то момент и бороться. Вы удаляете одну замечательную вещь о C#, это строго типизированный язык! ViewBag
не печатается строго, вы можете подумать, что вы проходите в List<T>
но вы могли бы просто передать string
,
И последнее замечание: вы также потеряете возможности Intellisense в Visual Studio.
Я чувствую, что в моем проекте может быть слишком грязно, если я создаю модель представления для каждого действия.
Разве это не так беспорядочно в ваших контроллерах, назначая все ViewBag
? Если бы это было ViewModel
Вы можете отправить его в класс 'Mapping', чтобы сопоставить ваш DTO с вашим View.
Вместо этого:
// ViewModel
var model = new CustomViewModel()
{
PropertyOne = result.FirstResult,
PropertyTwo = result.SecondResult,
}
//ViewBag
ViewBag.PropertyOne = result.FirstResult;
ViewBag.PropertyTwo = result.SecondResult;
Вы могли бы сделать это:
var mapper = new Map();
var model = mapper.MapToViewModel(result);
* Очевидно, что вам нужно обеспечить имплементацию к классу отображения, посмотрите на что-то вроде Automapper
I'd also prefer the partial view to accept only a view model which is a collection of records, just a pure IEnumerable<> object. I'd rather avoid to send the full view model object from a main view because it also contains a lot of different properties, objects, that control paging, sorting, filtering etc.
That is fine, just create a view model that has a property of IEnumerable<T>
, In my opinion you should try and use a strongly typed ViewModel
in all of your scenarios.