ASP.NET MVC: как создать базовое Pseudo ViewState? Или лучшее решение?

Я новичок в MVC и понимаю все замечательные вещи, в том числе причины, по которым недоступно viewstate, однако есть некоторые обстоятельства, когда я думаю, что какое-то состояние представления будет весьма удобным, в моем случае я я думаю о страницах списка с различными фильтрами поиска, которые могут быть применены к списку.

Было бы целесообразно реализовать какое-то псевдо-представление для хранения этой информации в некоторых случаях? или есть лучшее решение?

Есть ли какие-нибудь примеры?

Ваши комментарии оценены.

Ответ 1

Теоретический ответ

ViewState - одна из концепций ASP.NET WebForms, которая считается ОЧЕНЬ вредной. Он используется для хранения состояния некоторых элементов управления и делает очень-очень уродливое скрытое поле в HTML.
Это нежелательно для некоторых людей для SEO (поисковая оптимизация) и других причин.

MVC не предоставляет некоторые абстракции, которые делают WebForms по некоторым основным причинам:

  • Он дает вам полный контроль над вашими URL-адресами и выводить HTML
  • Элементы управления WebForms (особенно "продвинутые" ) делают нежелательный HTML, MVC позволяет писать собственный HTML
  • Чтобы избежать этих сбоев, MVC не использует принцип управления, событий и т.д.
  • Если вы хотите, чтобы ваша веб-инфраструктура абстрагировалась от истинного способа HTTP, вы должны продолжать использовать WebForms

По правде говоря, HTTP - это протокол безстоящий, который WebForms пытается скрыть от вас, введя концепцию Controls, а также их состояние и события.
MVC не лжет вам и не пытается ничего скрывать от вас.

Практический анкер

Вы можете использовать ViewData вместо ViewState.
Вы устанавливаете элемент (ViewData["Something"] = yourObject) в Controller, а затем можете получить его в View. Вы можете использовать его, чтобы "запомнить" все, что вы хотите.

Итак, в основном, сохраняющаяся информация состоит в том, что она читает ее из Request.QueryString или Request.Form в соответствующем действии Controller, устанавливая ее в ViewData, а затем извлекает информацию ViewData в View.

Например:

Действие контроллера:

string textBoxValue = Request.Form["myTextBox"];
...
ViewData["myTextBox"] = textBoxValue;

Вид:

<% using (Html.BeginForm()) { %>
<%= Html.TextBox("myTextBox") %>
<% } %>

Другие материалы

Ознакомьтесь с некоторыми связанными с MVC вопросами (например, этот) и прочитайте книгу MVC (по крайней мере, о бесплатной главе NerdDinner).
MVC будет намного понятнее для вас, я обещаю!

Ответ 2

В ASP.NET MVC сохранение состояния обычно обрабатывается путем округления информации о состоянии обратно в представление.

Например, в примерах NerdDinner CRUD они показывают, как вы можете отправить форму, проверить наличие ошибок и, если есть ошибки, снова отобразите форму с сохраненными данными, включая необходимые сообщения об ошибках.

Это работает, потому что метод контроллера, обрабатывающий POST, просто передает данные обратно в представление:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(int id, FormCollection formValues) {

    Dinner dinner = dinnerRepository.GetDinner(id);

    try {

        UpdateModel(dinner);

        dinnerRepository.Save();

        // No Errors, return to detail view
        return RedirectToAction("Details", new { id=dinner.DinnerID });
    }
    catch {

        foreach (var issue in dinner.GetRuleViolations()) {
            ModelState.AddModelError(issue.PropertyName, issue.ErrorMessage);
        }

        // Errors, display form again.  Pass state information back to form.
        return View(dinner);
    }
}