Чтобы сохранить его без JavaScript, вы можете разбить поиск на несколько действий.
Первое действие (/ Search /? Q = whodunit) просто выполняет некоторую проверку ваших параметров (чтобы вы знали, нужно ли повторно отображать форму), а затем возвращает представление, которое использует мета-обновление, чтобы указать браузер возвращается к «реальному» поисковому действию.
Вы можете реализовать это с помощью двух отдельных действий контроллера (скажем, «Поиск» и «Результаты»):
public ActionResult Search(string q)
{
if (Validate(q))
{
string resultsUrl = Url.Action("Results", new { q = q });
return View("ResultsLoading", new ResultsLoadingModel(resultsUrl));
}
else
{
return ShowSearchForm(...);
}
}
bool Validate(string q)
{
// Validate
}
public ActionResult Results(string q)
{
if (Validate(q))
{
// Do Search and return View
}
else
{
return ShowSearchForm(...);
}
}
Но это дает вам некоторые препятствия в плане освежения. Таким образом, вы можете объединить их обратно в одно действие, которое может сигнализировать о двухфазном процессе с использованием TempData.
static string SearchLoadingPageSentKey = "Look at me, I'm a magic string!";
public ActionResult Search(string q)
{
if (Validate(q))
{
if (TempData[SearchLoadingPageSentKey]==null)
{
TempData[SearchLoadingPageSentKey] = true;
string resultsUrl = Url.Action("Search", new { q = q });
return View("ResultsLoading", new ResultsLoadingModel(resultsUrl));
}
else
{
// Do actual search here
return View("SearchResults", model);
}
}
else
{
return ShowSearchForm(...);
}
}
Это охватывает пункты 2, 3, 4 и, возможно, 5.
Включение поддержки # 1 подразумевает, что вы собираетесь хранить результаты поиска в сеансе, в БД и т. Д.
В этом случае просто добавьте желаемую реализацию кеша как часть бита «Делать фактический поиск здесь» и добавьте check-for-cached-result, чтобы обойти страницу загрузки. например,
if (TempData[SearchLoadingPageSentKey]==null)
становится
if (TempData[SearchLeadingPageSentKey]==null && !SearchCache.ContainsKey(q))