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(...);
}
}
これは、#1のサポートを含めるにはポイント2、3、4、間違いなく5
をカバーでは、検索のいずれかのセッションでは、DBなどの結果を格納しようとしていることを意味し
この場合、「ここで実際に検索します」ビットの一部として必要なキャッシュ実装を追加し、読み込みページをバイパスするためにキャッシュのチェックを追加します。例えば
if (TempData[SearchLoadingPageSentKey]==null)
if (TempData[SearchLeadingPageSentKey]==null && !SearchCache.ContainsKey(q))