2010-08-30 2 views
4

Я работаю над ASP.NET MVC-контроллером с несколькими методами действий, для каждого из которых нужен один и тот же бит данных. Эти данные требуют поиска, который может быть выполнен только с помощью значений маршрута (поэтому я не могу выполнить поиск в конструкторе). Я уверен, что это было обсуждено подробно, но я еще не нашел удовлетворительной рекомендации.ActionFilter или RenderAction в ASP.NET MVC?

Каков наилучший способ получить эти данные без повторения в каждом методе действий? Я работаю через:

  • создать действие фильтра, это похоже лучший выбор, но где хранить объект, в параметрах действий? Уместно ли создать объект ViewModel в фильтре действий и передать его непосредственно методам действий, чтобы они заполнили остальную часть объекта ViewModel?

  • Создайте дочернее действие (Html.RenderAction) для рендеринга этих данных, но для этого требуется второй набор поисков, поскольку для действия дочернего элемента требуется еще один полный цикл создания экземпляра контроллера.

  • Вспомогательный метод/свойство, называемое в каждом методе действия.

Мысль или мнения о наилучшем подходе здесь?

+0

Не могли бы вы рассказать о том, что * такой же бит данных * есть? И та же самая часть объекта нужна в других действиях контроллера? И если да, то хотите ли вы использовать тот же * ActionFilter *? В зависимости от того, что это такое, я бы предположил, что не пошел по дороге ActionFilter. – Charlino

+0

Представьте себе набор подробных страниц, отображающих информацию для проекта. Основные детали проекта (статус, идентификатор и т. Д.).) отображаются на каждой странице, а затем есть какая-либо информация о проекте, отображаемая на их соответствующих страницах. Объект детали проекта необходим каждому действию в контроллере, поэтому он будет тем же ActionFilter для каждого метода действий. Спасибо за вопрос. – RyanW

ответ

1

Фильтр, вероятно, лучший выбор, и вы можете сохранить объект в ViewData.

Другой вариант (не лучший) - создать свой собственный базовый класс контроллера, который переопределяет метод ExecuteCore и выполняет поиск там.

Я сделал это для ведения журнала, так как я хочу регистрировать каждый просмотр страницы, и я не хотел добавлять фильтр к каждому контроллеру, который я сделал. В mvc 3 появится способ объявить глобальные фильтры, которые также могут исправить это.

+0

Я ехал по этой дороге, кажется, хороший способ это сделать. Но потом мне пришлось вытащить объект из ViewData в каждом методе действия, снова повторить себя и сделать что-то, что может быть проще и понятнее в простом вспомогательном методе, поэтому я немного замалчиваю идею фильтра прямо сейчас. – RyanW

+0

Вы можете использовать мастер-страницы и создать вспомогательный метод для вытягивания данных из ViewData, чтобы сохранить некоторую повторяемость. – Sruly

0

Вы можете переопределить метод OnActionExecuting() в контроллере и получить данные там.

+0

Спасибо за подсказку. Это было бы эквивалентно добавлению фильтра на уровне контроллера вправо? Поскольку это будет вызвано для каждого действия. – RyanW

+0

Нижняя сторона здесь заключается в том, что тестируемость уменьшается (как в случае с фильтрами), так как код дополнительно отделен и зависит от времени выполнения mvc. Преимущество в этом отношении имеет связующий и вспомогательный метод. – RyanW

1

Хорошо, так что, учитывая то, что вы мне сказали, я бы предложил использовать пользовательский ModelBinder.

Это наиболее подходящий вариант для ситуации. Я бы сказал, что использование фильтра является неправильным подходом, потому что задание фильтра не связано с привязкой данных - это работа для ModelBinder.

HTHS,
Чарльз

EDIT: Я только думал об этом, и я немного порвана, если вы должны использовать модель связующего или нет.

Общее правило большого пальца, которое я только что придумал, заключается в том, что если вам нужно ProjectDetails внутри самого действия, используйте ModelBinder, но если вам не нужны ProjectDetails внутри действия, используйте ActionFilter, чтобы просто добавить его в вашей модели/viewdata.

Возможно, кто-то другой может забросить их 2c.

+0

Интересно, я даже не думал о ModelBinder. Я тоже это изучу. Благодарю. – RyanW

+0

Из вашего другого комментария к ответу @ Sruly, похоже, что вы используете ProjectDetails внутри метода действия ... Если это так, я определенно использовал бы подход ModelBinder, не говоря уже об этом. – Charlino

+0

Используется, но только в том, что метод действия вытаскивает ProjectDetails из ViewData и загружает его в ViewModel. – RyanW

Смежные вопросы