JavaScriptを使用しないようにするために、検索を複数のアクションに分割できます。
最初のアクション(/ Search /?q = whodunit)は、パラメーターの検証を行い(フォームを再表示する必要があるかどうかがわかります)、メタリフレッシュを使用してブラウザーを指すビューを返します。 「実際の」検索アクション。
これは、2つの別々のコントローラーアクション(検索と結果など)で実装できます。
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を使用して2フェーズプロセスを通知できる単一のアクションにそれらを再マージできます。
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のサポートを含めることは、検索結果をセッション、データベースなどに保存することを意味します。
この場合、「ここで実際の検索を実行」ビットの一部として目的のキャッシュ実装を追加し、キャッシュ結果のチェックを追加して、読み込みページをバイパスします。例えば
if (TempData[SearchLoadingPageSentKey]==null)
になります
if (TempData[SearchLeadingPageSentKey]==null && !SearchCache.ContainsKey(q))