2009-04-17 3 views
21

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

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

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

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

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

ответ

20

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

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

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

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

+0

Я не согласен с вами, но имейте в виду, что липкая сессия или состояние центрального сеанса являются плохими новостями для масштабируемости. Конечно, можно масштабировать, но это усложняет жизнь. Если состояние сеанса можно избежать, то история масштабирования намного лучше - возможно, именно поэтому OP опасается этого? –

+4

Как вы это определяете? Я масштабировал несколько систем, используя этот метод, и не сталкивался с проблемами. Очень сложно полностью избежать сеанса, особенно когда вы входите в учетную запись пользователей и т. Д. –

1

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

+0

Вы имеете в виду помощника html для ""? С этим я мог хранить только простые значения, мне нужно сохранить и заполнить сложный объект – antonioh

+0

http://stackoverflow.com/questions/669492/asp-net-mvc-is-there-a-way-to-simulate-a -viewstate/669495 # 669495 –

+0

Спасибо, но это не совсем то, что я искал. Я ищу стандартные хорошие практики. Это хорошая идея. – antonioh

2

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