Должен ли я всегда использовать модель представления или можно использовать 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.

Другие вопросы по тегам