Я ищу мысли о том, как использовать Session в приложении ASP.NET MVC? Особенно при использовании мастер-страниц и попыток просто получить данные на мастер-страницу, не обходя контроллер. Этот вопрос начался с того, что я задал много небольших вопросов, но затем мне удалось превратить его в решение, которое я пока не реализовал, но которое несколько работоспособно. Буду признателен за любые отзывы.
Мое предлагаемое решение, также называемое «что я собираюсь реализовать, если кто-то не скажет« Стоп »!»
У меня есть классы моделей, унаследованные от ModelBase - которая содержит информацию, необходимую главной странице (только один просмотр на страницу) для определенных вещей, которые она отображает в заголовке или нижнем колонтитуле, а также параметры, определяемые конфигурацией, в зависимости от того, кто авторизовался.
Мое лучшее решение следующее - показано здесь для «страницы продуктов»:
Предположение : В какой-то момент я уже застрял в сеансе с определенными данными - например, возможно, partnerId
, который поступил через страницу шлюза, или свойство currentLoggedInUserEmail
или полностью удаленный объект.
У меня есть класс ModelBase
, от которого наследуется каждая модель, например ProductModel
У меня есть класс MySiteControllerBase
(унаследованный от Controller), который имеет подкласс ProductController
.
В моем методе действия в ProductController
я создаю модель для вида продукта с помощью 'new ProductModel()'
. Этот класс модели сам ничего не знает о сеансе или о том, как заполнять ModelBase
. По сути, он даже не знает о ModelBase
- он просто наследуется от него. Мой цепочечный конструктор ничего не делает (потому что я не хочу его передавать Session
).
Я переопределяю View(...)
в MySiteControllerBase
для всех перегрузок, которые принимают параметр модели. Я проверяю, имеет ли этот параметр тип ModelBase
, и если это так, я заполняю свойства, такие как partnerid
и currentLoggedInuserEmail
. К счастью, потому что я нахожусь в классе, который наследует от Controller
, у меня есть прямой доступ к Session
, поэтому я могу вытащить их прямо оттуда.
Этот метод означает, что свойства ModelBase
автоматически заполняются только мной, делая 'return View(model)'
. Однако существует очевидная проблема, если модели для ProductModel
требуется доступ ко всему, что определено в ModelBase
. Он станет нулевым, потому что он еще не заполнен.
Эту проблему можно решить, передав Session
в new ProductModel(session)
, который, в свою очередь, передаст ее по цепочке конструктора в new ModelBase(session)
. Мне действительно не нравится это решение, потому что мне нравится думать о модели как о довольно глупой структуре данных, которая вообще не должна знать ни о каких внешних конструкциях данных. Другое решение может заключаться в том, чтобы просто включить его, и если я когда-нибудь обнаружу, что ProductController
нужно потреблять что-то определенное в ModelBase
, я просто создаю метод MySiteControllerBase.UpdateModelBase(productModel, session)
, чтобы явно заполнить его внутри ProductController
. Я надеюсь, это ясно!
Другие вопросы, которые приходят на ум:
- А как насчет юнит-тестирования? Есть ли какая-то абстракция вокруг состояния сеанса в MVC или я должен создать свой собственный? Я выполнил поиск по исходному коду для 'session', и ничего не вышло!
- Как отслеживание сеансов работает с / REST / FUL / URLS в MVC? Есть ли какие-либо проблемы с cookie-файлами, о которых мне нужно знать?
- Должен ли я думать о сессии иначе, чем у меня традиционно?