Является ли ViewBag и ViewData частью управления состоянием в asp.net mvc?
Может кто-нибудь сказать мне, пожалуйста, являются ли ViewData и ViewBag частью управления состоянием asp.net mvc или нет? Спасибо
3 ответа
ViewBag
а также ViewData
не сохраняют состояние, но могут передавать его представлениям, которые будут отображаться и храниться.
Что ViewBag
а также ViewData
?
ViewBag
а также ViewData
не являются механизмами сохранения состояния, но я считаю, что они являются частью управления состоянием: они представляют собой механизмы для передачи данных на страницу, которые затем могут быть сохранены как состояние в сгенерированном html. Таким образом, они являются частью жизненного цикла состояния, так как позволяют сохранять состояние в HTML-коде на стороне клиента с помощью таких помощников, как @Html.HiddenFor
или же @Html.ActionLink
,
В моем ответе на "сохранение значения js из 1 ActionResult для использования в другом ActionResult" я рассказываю о том, как ViewBag
а также ViewData
может использоваться для хранения состояния в клиентском html, и каковы различные варианты хранения состояний.
Что за что ViewBag
это на самом деле dynamic
способ доступа ViewData
, так ViewBag.MyItem = "foo";
а также var valueEqualsFoo = ViewData["MyItem"];
установит и вернет ту же строку и может быть заменен.
На что они похожи?
ViewBag
, ViewData
наиболее тесно связаны с моделью представления в действии, где модель передается в представление внутри действия с использованием return View(viewModel);
: все три метода передают состояние в памяти в html, где оно отправляется клиенту, на любые промежуточные кэши и "сохраняется" вне вашего сервера.
Аналогичным образом, когда строка запроса в URL-адресе отправляется на сервер в запросе http, это метод передачи состояния, фактическим хранилищем состояний является <a href="urlwithquerystring">...</a>
якорь в HTML. Restful URL и тела для запросов POST ajax одинаковы по своему определению и поведению. ViewBag/Data
передать состояние из Action в html, который передается клиенту и сохраняется, строку запроса или URL-адрес restful, а затем передать состояние обратно на сервер для использования в следующем вызове Action.
Когда я должен их использовать?
Трудно проверить наличие динамических свойств с ошибкой в коде Razor; легко проверить, существует ли свойство в строго типизированной модели представления. Поэтому я считаю, что вы должны использовать их очень редко. На мой взгляд, предпочтительнее создавать строго типизированные модели представления, чем использовать ViewBag
или же ViewData
, Они могут быть хорошими для быстрого и грязного решения, но эти вещи, как правило, создают технический долг. ViewBag
возможно подходит для установки заголовка страницы.
Сильно типизированные модели просмотра:
- упростить использование сопоставления с такими фреймворками, как http://automapper.org/;
- сделать взгляды более тестируемыми; а также
- упростить создание разных представлений для разных устройств, когда вы передаете одну и ту же модель каждому представлению †
Каковы мои варианты для государственного хранения?
Я сказал это здесь, и я скажу это снова: раньше было по крайней мере Девять вариантов для управления постоянным состоянием пользователя в ASP.NET, и многие из них все еще применяются в MVC. Все они имеют различное использование в зависимости от того, как должно использоваться состояние. Как правило, код на стороне сервера, который по возможности не содержит состояний, легче тестировать и отлаживать.
- Хранение на стороне клиента включает в себя:
- Объекты передаются обратно в результате html и превращаются в:
- Поля ввода
- Скрытые поля
- Переменные Javascript для использования в телах POST запроса ajax
- Строковые значения запроса и пути в URL (например, Restful URLs, например
/Product/1
)
- Старые методы ASP.NET, которые сохраняют состояние в скрытых полях HTML, таких как
ViewState
- Печенье
- Методы HTML5, такие как локальное хранилище
- Анти-подделка токенов генерируется для предотвращения XSRF
- Объекты передаются обратно в результате html и превращаются в:
- Серверное хранилище (напрямую связано с ASP.NET и ASP.NET MVC):
- Сессия (доступна через контроллер
Session
имущество - Кэш (доступен через контроллер
Cache
имущество) - TempData
- HttpContext ["ключ элемента"]
- Приложение (доступно через контроллер
HttpContext
собственность какHttpContext.Application
) - Файлы Web.config и Machine.config (да, они также содержат состояние, оно только для всего приложения) и, следовательно,
WebConfigurationManager.AppSettings
толковый словарь.
- Сессия (доступна через контроллер
- Серверное хранилище (другое):
- Базы данных, будь то SQL или NOSQL
- Файловое хранилище
- Очереди сообщений, такие как WASB
Примечания:
† Теперь у нас есть простые в использовании инструменты для адаптивного дизайна, которые мы можем использовать, когда это уместно, но это не всегда подходит: некоторые виды должны выглядеть совершенно иначе на мобильных устройствах, но при этом использовать ту же модель представления, что и на сайте с большим экраном.
Оба не являются!
Управление состоянием имеет 2 типа 1: сторона клиента, 2: сторона сервера
Сторона клиента
- Скрытое поле
- Просмотр состояния
- Печенье
- Control State -Query Strings
Серверная сторона
- сессия
- заявка
Если вы хотите, чтобы разница для них, пожалуйста, посмотрите здесь В чем разница между ViewData и ViewBag?
В View Data, View Bag и Temp data мы будем переносить данные с контроллеров для просмотра, поэтому они являются частью управления состоянием в MVC. Средство управления состоянием сохраняет состояние контроллеров и веб-страницы, а также объектов и данных.
Это может быть сделано следующими способами: Управление состоянием на стороне клиента Управление состоянием на стороне сервера.
Вкратце, чтобы узнать https://www.codeproject.com/Articles/492397/State-Management-in-ASP-NET-Introduction.