ASP.NET MVC: сохранение состояния последней страницы - PullRequest
4 голосов
/ 18 ноября 2011

Вот ситуация: у меня есть SearchPage, где пользователь может сделать сложный поиск. Ничего особенного. После отображения результатов пользователь может выбрать один из них и перейти на другую страницу (например, мастер / деталь).

У меня есть трещина, в которой хранятся места, где находился пользователь, и он может иметь более 4 уровней (например, Main -> 2Page -> 3Page -> 4Page -> NPage). Я хочу сохранить состояние каждого элемента управления на моей сложной поисковой странице, если пользователь использует точку перехода для перехода назад, поскольку я не хочу, чтобы он снова вручную устанавливал все эти поисковые фильтры.

До сих пор я использовал javascript:history.back(), но так как у меня может быть несколько уровней на моей крошке, это не очень полезно. Я думал об использовании OutputCache для этого, но я не знаю, как мне поступить.

UPDATE

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

1 Ответ

4 голосов
/ 18 ноября 2011

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

UPDATE: Когда пользователь заполняет текстовые поля фильтра поиска, вы как-то передаете эту информацию контроллеру. Вероятно, как некий строго типизированный объект.

Допустим, ваши пользователи вводят следующую информацию: - Критерии - Дата начала - EndDate

Существует модель с именем SearchCriteria, определенная как:

public class SearchCriteria
{
    public string Criteria { get; set; }
    public DateTime? StartDate { get; set; }
    public DateTime? EndDate { get; set; }
}

Ваше действие может выглядеть примерно так:

[HttpGet]    
public ViewResult Search()
{
    SearchCriteria criteria = new SearchCriteria();

    if (Request.Cookies["SearchCriteria"] != null)
    {
        HttpCookie cookie = Request.Cookies["SearchCriteria"];
        criteria.Criteria = cookie.Values["Criteria"];
        criteria.StartDate = cookie.Values["StartDate"] ?? null;
        criteria.EndDate = cookie.Values["EndDate"] ?? null;
    }

    return View(criteria);
}

[HttpPost]
public ActionResult Search(SearchCriteria criteria)
{
    // At this point save the data into cookie
    HttpCookie cookie;

    if (Request.Cookies["SearchCriteria"] != null)
    {
        cookie = Request.Cookies["SearchCriteria"];
        cookie.Values.Clear();
    }
    else
    {
        cookie = new HttpCookie("SearchCriteria");
    }

    cookie.Values.Add("Criteria", criteria.Criteria);

    if (criteria.StartDate.HasValue)
    {
        cookie.Values.Add("StartDate", criteria.StartDate.Value.ToString("yyyy-mm-dd"));
    }

    if (criteria.EndDate.HasValue)
    {
        cookie.Values.Add("EndDate", criteria.EndDate.Value.ToString("yyyy-mm-dd"));
    }

    // Do something with the criteria that user posted

    return View();
}

Это какое-то решение. Пожалуйста, поймите, что я не проверял это, и я написал это из головы. Он призван дать вам представление о том, как вы можете решить эту проблему. Возможно, вам также следует добавить Action в SearchCriteria, чтобы вы могли проверить, является ли это подходящим действием, в котором вы читали бы cookie. Кроме того, чтение и запись файла cookie следует перенести в отдельный метод, чтобы вы могли читать его из других действий.

Надеюсь, это поможет,

Huske

...