Asp.Net MVC и сессия - PullRequest
       15

Asp.Net MVC и сессия

20 голосов
/ 17 апреля 2009

Я хотел бы создать объект в разных шагах в приложении asp.net mvc, каждый шаг - это отдельная страница. Такие вещи вы бы сохраняли в Session в быстром приложении Web.Forms.

Читая об этом, сессия не кажется мне чем-то очень asp.net MVC'ish. Однако я не могу думать о других альтернативах этой ситуации, поскольку TempData и ViewData, похоже, тоже не подходят, так что, возможно, я ошибаюсь.

Конечно, я мог бы поместить 4 шага на одной странице и показать / скрыть, но это не моя точка зрения на вопрос. Мне бы хотелось услышать ваше мнение о Session в MVC, если это хороший подход к многоэтапной проблеме такого рода или вы склонны делать это другими способами.

Это очень похоже на вопрос Переменные сеанса в ASP.NET MVC , за исключением того, что я не ищу, как получить доступ к сеансу, но если это лучший способ решить такую ​​проблему или есть что-то лучшее, что мне не хватает в Asp.Net MVC.

Заранее спасибо

Ответы [ 3 ]

19 голосов
/ 17 апреля 2009

В сеансе нет ничего не-MVC, это жизненно важная часть Интернета, и большинство сайтов используют его каким-то образом. У вас действительно есть два основных варианта. Либо сохраните объект в базе данных между страницами (что означает сохранение неполного объекта), либо поместите его в сеанс. Оба имеют свои преимущества и недостатки.

В сеансе вам не нужно сохранять частичный объект в базе данных, но если пользователь уходит или время сеанса истекает, вы теряете всю эту информацию. Это также может привести к увеличению объема памяти на пользователя, а при масштабировании это вызывает некоторые другие проблемы. (все это можно решить с помощью sticky-сессии на балансировщике нагрузки или в центральном хранилище сеансов).

Способ с базой данных лучше во многих отношениях, но обычно вы не хотите сохранять неполный объект в базе данных, один компромисс - создать другую таблицу и сохранить сериализованный объект в эту таблицу. Он не проходит через ваши реальные таблицы, и поэтому вам не нужно идти на компромисс с ограничениями вашей базы данных. (вы также можете хранить данные сеанса в базе данных, которая в основном делает то же самое)

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

2 голосов
/ 17 апреля 2009

Вы можете передавать его между представлениями с помощью TempData ... но вы должны продолжать передавать его через последующие представления. Он предназначен для последующего запроса, но это не значит, что вы не можете передать временные данные в следующий запрос, который также помещает те же данные во временные данные.

1 голос
/ 17 апреля 2009

Вы пробовали <%= Html.HiddenField(...) %>?

...