MVC вернуться на страницу с той же моделью

Я создал страницу поиска с 5 свойствами для фильтрации. Когда пользователь нажимает на один из результатов, загружается страница сведений. Теперь я хочу предоставить кнопку «Назад», чтобы пользователь мог вернуться на страницу поиска с исходным фильтром.

Я думал об использовании TempData для хранения модели фильтра. Tempdata хранится в сеансе только для одного вызова, поэтому сеанс не будет раздуваться через некоторое время.

Есть ли лучшее решение или у вас есть предложения? Дай мне знать!

Редактировать. Страница поиска будет использовать вызовы ajax для страницы, сортировки или фильтрации данных. Поэтому все эти данные нужно будет сохранить, если я хочу вернуться со страницы сведений. Является ли TempData лучшим способом?


person Beejee    schedule 19.09.2013    source источник


Ответы (2)


Почему бы не использовать для этого строку запроса? Например. поисковый запрос отправляется с использованием элемента <form /> с атрибутом method, для которого установлено значение «получить». В этом случае вы можете легко восстановить состояние формы, просто прочитав строку запроса, код будет намного проще. Посетители также могут легко добавить страницу в закладки и вернуться к результатам поиска позже.

Вид:

@model SearchResultSet;

<form method="get" action="/search">
    <input type="text" name="q" value="@Request.QueryString["q"]" />
    <input type="submit" value="Search" />
</form>

@if (Model.Total > 0)
{
    <ul>
        @foreach (var result in Model.Results)
        {
            <li>...</li>
        }
    </ul>
}

Модель и контроллер:

public class SearchResultSet
{
    public IList<SearchResult> Results { get; set; }
    public long Total { get; set; }
} 

public class SearchController : Controller
{  
    public ActionResult Index(string q = "")
    {
        return View(GetModel(q));
    }

    private SearchResultSet GetModel(string searchQuery)
    {
        // Get search results
    }
}

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

person volpav    schedule 19.09.2013
comment
Я планирую использовать вызовы ajax для пейджинга, сортировки и фильтрации на странице поиска. Веб-сайт будет использоваться как внутреннее веб-приложение, поэтому создание закладок не потребуется. - person Beejee; 19.09.2013
comment
@Beejee Вы можете использовать History API и по-прежнему использовать строку запроса (потому что это очень прозрачно, что происходит, и не подвержено ошибкам по сравнению с одноразовым хранилищем на основе сеанса). В качестве альтернативы вы можете попробовать jQuery BBQ в сочетании с управлением состоянием через hashbang. Приведенное выше решение также значительно упрощает написание модульных тестов для вашего приложения. - person volpav; 19.09.2013
comment
Пользователь сможет сортировать по нескольким свойствам. Так что у меня будут входы фильтра X. Как вы собираетесь поместить все это в строку запроса? Обычно я всегда привязываюсь к модели представления при использовании более двух свойств. - person Beejee; 20.09.2013
comment
Я не знал, что строка запроса может быть привязана к модели, как описано здесь. Это может пригодиться, да. Как вы планируете предоставить URL-адрес следующему контроллеру/действию, чтобы использовать его для кнопки «Назад»? Так как я буду использовать ajax вызовы на странице поиска. History API не будет содержать URL/строку запроса фильтра. - person Beejee; 20.09.2013
comment
@Beejee Вы можете сделать свою модель сериализуемой в строку запроса, как показано здесь. Переопределение метода ToString для этого может быть весьма удобным. - person volpav; 21.09.2013

Что ж, TempData сохраняет значение для одного вызова, но вы можете сохранить значение TempData, используя TempData.Keep(), пока не истечет срок действия сеанса.

TempData["YourKey"] = "SomeValue";
TempData.Keep("YourKey");

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

person AthibaN    schedule 19.09.2013
comment
Все еще не уверен, что это лучшее решение. - person Beejee; 19.09.2013
comment
Чтобы сохранить значения между контроллерами и на разных страницах, вам нужен TempData. - person AthibaN; 19.09.2013