2013-09-19 3 views
0

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

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

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

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

ответ

2

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

Вид:

@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 
    } 
} 

Надеется, что это помогает.

+0

Я планирую использовать вызовы ajax для поискового вызова, сортировки и фильтрации на странице поиска. Веб-сайт будет использоваться как внутреннее веб-приложение, поэтому закладка не понадобится. – Beejee

+0

@Beejee Вы можете использовать [History API] (https://developer.mozilla.org/en-US/docs/Web/Guide/API/DOM/Manipulating_the_browser_history) и по-прежнему использовать строку запроса (потому что это очень прозрачно, что происходит, а не подвержено ошибкам по сравнению с одноразовым хранилищем на основе сеанса). В качестве альтернативы вы можете попробовать [jQuery BBQ] (http://benalman.com/projects/jquery-bbq-plugin/) в сочетании с управлением состоянием через hashbang. Вышеупомянутое решение также упрощает запись модульных тестов для вашего приложения. – volpav

+0

Пользователь сможет сортировать по нескольким свойствам. Итак, у меня будут входные данные X-фильтра. Как вы собираетесь использовать все это в строке запроса? Обычно я всегда привязываюсь к viewmodel при использовании более двух свойств. – Beejee

2

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

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

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

+0

Все еще не уверен, что это лучшее решение. – Beejee

+0

Чтобы сохранить значения между контроллерами и различными страницами, 'TempData' является тем, который вы ищете. – AthibaN

Смежные вопросы