Подтвердить что ты не робот

Asp.net С# MVC: Как я живу без ViewState?

Я просто смотрю на преобразование WebForms в MVC:

В .net MVC, какие понятия делают ViewState тем, что не требуется?

Если форма отправлена ​​обратно на iteself и т.д. (т.е. postback)? как страница /usercontrol поддерживает свое состояние?

Какие трюки люди делают, чтобы поддерживать какое-то состояние и не прибегать к состоянию сеанса?

Несомненно, существует не вполне естественная среда существования?

4b9b3361

Ответ 1

Но, конечно, это возможно. Фактически, веб не имеет состояния. На самом деле любые мысли об обратном - это аберрация.

Веб-элементы управления удалены в MVC. На стороне сервера нет событий. Это заменяется двумя различными механизмами - URL-адресами и данными формы POST. Правильное их использование заменит вашу потребность в ViewState.

В обычном веб-приложении ASP.NET вы разместите LinkButton на своей веб-странице, которая будет выполнять функцию X. ASP.NET будет прикреплять множество веб-страниц ViewState cruft, javascript и других вещей, чтобы пользователь, щелкнув на кнопке и "назад" на веб-сайт (путем отправки формы, которую никто не знает), ASP.NET реконструирует произошедшее и определяет, какой конкретный обработчик событий кнопки должен быть выполнен.

В MVC вы создаете свою ссылку для доступа к определенному маршруту. Маршрут описывает, что пользователь хочет сделать -/Users/Delinquent/Index (показать список всех просроченных пользователей). Система маршрутизации в MVC определяет, какой контроллер будет обрабатывать этот маршрут, и какой метод будет выполняться на этом контроллере. Любая дополнительная информация может быть передана методу контроллера по значениям строки запроса URL (? Page = 5 для 5-й страницы правонарушителей).

В дополнение к URL-адресам вы можете использовать HTML-формы для POST, чтобы получить более сложную информацию (например, ценность данных в форме) или вещи, которые не будут вписываться в строку запроса, например файл.

Итак, вы "поддерживаете" состояние через строки запроса и формируете значения POST. Вы обнаружите, что на самом деле в конечном итоге не так много состояния для поддержания. Фактически, необходимость поддерживать много состояний - хороший признак того, что ваш дизайн отсутствует или что вы пытаетесь сделать что-то, что не соответствует модели веб-сайта.

Ответ 2

Некоторые связанные вопросы:


На большинстве традиционных веб-языков концепция состояния состояния среды на самом деле довольно необычна. ASP.NET Webforms является исключением из правила и создает это исключение, заново изобретая множество стандартов. Цель Webforms - в основном абстрагировать концепцию HTML и веб-разработки в целом, чтобы линия между настольным приложением и веб-приложением стиралась с точки зрения разработки. Обычно это обычно означает, что решение, которое ASP.NET Webforms обеспечивает, хотя и эффективно, является реализацией по принципу "всего-на торгах", что приводит к некоторому очень подробному выводу, который работает достаточно хорошо, чтобы удовлетворить большинство. И наоборот, основным преимуществом ASP.NET MVC является то, что он возвращает управление выводами HTML разработчику и позволяет им создавать сильно архивированные, RESTful веб-приложения, которые лучше определены и более чисты в их реализации и презентации, несмотря на то, что приносят в жертву некоторый уровень удобства.

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

Сравнение номер один, которое я хотел бы сделать, просто: Webforms создает веб-страницы, но MVC создает веб-приложения. Если ваша повседневная работа состоит прежде всего в создании фрагментов веб-сайта или добавлении небольших фрагментов функциональности, вы часто найдете Webforms намного проще и меньше времени; с другой стороны, если вы хотите создать полное приложение, которое можно тестировать, масштабировать и гибко, MVC является вашим вызовом.

Ответ 3

viewstate - это просто большое, уродливое скрытое поле формы.

Выпишите свои скрытые поля формы и зашифруйте их, если вам нужно.

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

Ответ 4

Если форма отправлена ​​на себя и т.д. (т.е. обратная передача)? как page/usercontrol поддерживать свое состояние? Какие трюки люди делают, чтобы поддерживать какое-то состояние и не прибегать к состоянию сеанса?

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

В .net MVC, какие понятия ViewState что-то не требуется?

Репрезентативный перенос состояний (REST).

Ответ 5

MVC имеет некоторые преимущества по сравнению с WebForms, но также имеет некоторые недостатки, а также я подробно рассмотрел этот ответ. Я думаю, что основной вопрос, который вы должны задать себе, заключается в том, является ли ViewState проблемой для вас сейчас - и есть ли такая проблема, что вы должны переписать свое приложение? Если нет, то Learning MVC является достойной целью (это действительно здорово), но не тот, на который я бы рискнул.

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

Наконец, вы спрашиваете, что делают люди, чтобы избежать состояния сеанса. Есть ли причина, чтобы избежать состояния сеанса? Разумеется, вам не нужна большая информация, но избежать этого совсем не обязательно и, по сути, будет стоить вам одного из самых мощных инструментов в вашем арсенале.

Ответ 6

Все ответы, говорящие о том, что ASP.NET MVC не используют состояние, в значительной степени верны. Но ASP.NET MVC фактически использует какое-то состояние, хотя он не работает ничего похожего на ViewState.

Обычно, когда кто-то отправляет данные в ваше приложение, вы захотите проверить данные и отобразить сообщение об ошибке, если данные недействительны. Однако, если вы сразу же вернете страницу, содержащую сообщение об ошибке, когда пользователь нажимает F5 для перезагрузки страницы, данные будут повторно отправлены. Обычно это не то, что вы хотите. Таким образом, когда вы понимаете, что данные POSTed недопустимы, вы хотите сообщить пользователям GET страницу (или, возможно, другую страницу) и показать сообщение об ошибке. Вы делаете это, возвращая код статуса перенаправления HTTP. Однако, как только появится запрос пользователя GET, как вы узнаете, какое сообщение об ошибке отобразится? Вам нужно как-то запомнить это с того момента, как вы (сервер) обрабатываете POST, пока не будете обрабатывать GET.

Для этого вы используете функцию ASP.NET MVC, называемую TempData. На самом деле это всего лишь оболочка вокруг сеанса, которая гарантирует, что все, что вы впишете в словарь TempData, останется там до следующего запроса и больше не будет.

Ответ 7

Рассмотрим тот факт, что движение REST в веб-программировании основывается на идее, что состояние плохо для программы. В Википедии есть достойное описание со ссылками: http://en.wikipedia.org/wiki/Representational_State_Transfer

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

Для некоторых обсуждений MVC в ASP.NET и REST: http://blog.wekeroad.com/2007/12/06/aspnet-mvc-using-restful-architecture/

Ответ 8

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

Ответ 9

Автогенерированное состояние представления не существует в MVC, но вы можете написать свой собственный, просто используя скрытые поля,

В MVC вы не увидите много зашифрованных символов в верхней части страницы, которые вам не нужны.

Ответ 10

На самом деле это так. Вы должны забыть о том, как сопротивление было составлено с помощью viewstate.

У вас также есть возможность конвертировать в ваш отзыв обратно на страницу, чтобы "вызвать контроллер". Таким образом, это будет легче понять впоследствии. Вместо вызова страницы вы вызываете контроллер, который возвращает представление. Таким образом, либо вы строите всю свою "страницу" снова и снова при каждом вызове, или вы решаете иметь дело только с тем, что действительно влияет на действие. Если кнопка меняет div, зачем загружать всю страницу. Просто позвоните на ваш контроллер и верните то, что должно быть новыми данными в вашем div.

например, представьте себе сценарий мастера/детали:

<h2>Groups</h2>
    <div id="GroupList">
    </div>
    <div id="GroupDetail" title="Detail Group">
</div>

Список группы загружается один раз в div и там это вызов ajax, возможный для контроллера для каждого элемента списка группы:

<%= Ajax.ActionLink("Edit", "DetailLocalisationGroup", 
                     new { id = group.Id }, 
                     new AjaxOptions() { 
                         UpdateTargetId = "DetailLocalisationGroup", 
                         OnSuccess = "InitialisationDetailGroup" })%>

который вызывает это действие DetailLocalisationGroup, которое должно передать div GroupDetail с помощью html.

[AcceptVerbs("POST")]
public ActionResult DetailLocalisationGroup(int id)
{
    LocalisationGroup group = servicelocalisation.GetLocalisationGroup(id);
    return View("DetailGroup", group);
}

Теперь в div есть форма, и при нажатии кнопки отправки этой формы мы просто отправляем информацию, которая нам действительно нужна, контроллеру, который затем сохранит данные в базе данных.

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

Ответ 11

Вы можете имитировать состояние представления с помощью проекта MVC3Futures. Он сохранит всю модель в поле зрения.

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

@Html.Serialize("Transfer", Model, SerializationMode.EncryptedAndSigned)

И в контроллере добавить десериализованный атрибут.

public ActionResult Transfer(string id,[Deserialize(SerializationMode.EncryptedAndSigned)]Transfer transfer)

Ответ 12

После прочтения всех этих сообщений, похоже, что MVC не подходит для приложений типа LOB, где у вас будет много элементов управления и операций CRUD, и вы хотите сохранить состояние элементов управления. Существует множество причин, по которым вы хотите, чтобы пользователь оставался на одном и том же экране и сохранял состояние после выполнения операций отправки. Например, чтобы показать ошибки, сообщения о проверке на стороне сервера, сообщения об успешности или выполнить любое другое действие. перенаправление пользователя на другой вид, чтобы показать эти сообщения, нецелесообразно.

Ответ 13

Вы можете сохранить любой объект в состоянии сеанса.

 HttpContext.Session["userType"] = CurrentUser.GetUserType();