我有一个 SearchController 与行动,可以执行一些长期运行的搜索和返回的一个结果页面上。搜索可以采取任何地方从1到60秒。网址的搜索是一个HTTP得到请求的形式: http://localhost/Search?my=query&is=fancy

体验我正在寻找类似于许多旅游网站。我想给一个中间"Loading..."页面,在那里, 理想的情况是:

  1. 用户可以重新载入页面没有重新启动搜索
  2. 一旦回端搜索完成后,用户被重新定向的结果
  3. 经验降低于浏览器与JavaScript无障碍
  4. 后背的按钮/浏览记录,不应包括本质页。
  5. 在较短的情况下搜索(1次),它并没有产生重大影响的时间得到的结果或经验(大丑页闪烁,无论)

这些都是可有可无的。我向所有人开放的想法!谢谢。

有帮助吗?

解决方案

您可以做它以下方式:

  • 做的搜索请求(获得url)与阿贾克斯
  • 搜索网址不返回的结果,而是返回的一些Json或XML内容与URL的实际结果
  • 客户页表示"loading..."信息,同时在等待阿贾克斯呼叫完成
  • 客户页重定向到的结果页面时完成。

一个例子使用jquery:

<div id="loading" style="display: none">
  Loading...
</div>
<a href="javascript:void(0);" 
  onclick="searchFor('something')">Search for something</a>

<script type="text/javascript">
  function searchFor(what) {
    $('#loading').fadeIn();
    $.ajax({ 
      type: 'GET', 
      url: 'search?query=' + what, 
      success: function(data) { 
        location.href = data.ResultsUrl; 
      } 
    });        
  }
</script>

(编辑)

控制器,将是这样的:

public class SearchController 
{
  public ActionResult Query(string q) 
  {
    Session("searchresults") = performSearch();
    return Json(new { ResultsUrl = 'Results'});
  }

  public ActionResult Results()
  {
    return View(Session("searchresults"));
  }
}

考虑伪码:我实际上没有进行测试。

其他提示

为了保持它javascript-不,你可以打破的搜索到多个行动。

第一action(/Search/?q=侦探小说)只是做了一些验证你的参数(所以你知道如果你需要重新显示形式),然后返回查看其使用的元刷新要点的浏览器回到"真正的"搜索行动。

你可以实现这两个单独的控制器的行动(例如搜索和结果):

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意味着你要去商店搜索的结果无论是在会议、数据库等。

在这种情况下,只要加入你希望的缓implementatin的一部分作为"做实际搜索这里"位,并增加一个检查-对于缓存的结果为旁路的装载网页。例如

if (TempData[SearchLoadingPageSentKey]==null)

变得

if (TempData[SearchLeadingPageSentKey]==null && !SearchCache.ContainsKey(q))

好的问题。我可以很快实行一个类似的解决方案在asp.net 视自己,但我不认为它需要一种根本不同的执行比web表单为基础的解决方案,其中有各种例子在网:

我之前已经建立了一个执行基于第一个链接上网的形式。基本过程为:

  1. 初始请求页w/搜索参数
  2. 这一页开始了一个新的螺纹其执行的长期运行的任务
  3. 这页重定向用户"下处理"网页,其中有一个http刷新标题置于重新装载,每隔几秒钟
  4. 线进行搜索,更新"全球"静态的搜索进行的对象的指示%完成,而下的过程页读取它,显示的进展。(每个搜索存储由GUID id在Hashtable,所以多个并行搜索的支持)
  5. 一旦完成在线更新的搜索进展如时下的流程页检测到这一点,它重定向到一个最终的"结果"页面。

(一定要检查的第二链接,从MSDN,这是相当不同的解决办法,但不是一个我只有脱脂。)

这样做的好处是,它不需要Javascript。最大的缺点我能想到的(从用户的角度看)是,它不是完全的"Web2.0",用户将需要等待通过一系列的浏览器刷新。

东西基于@Jan Willem B的AJAX的基础的建议应该是一个可行的替代这种多螺纹等待状态的模式。其中最能满足您的要求是什么你得决定对你自己的。例从aspfree.com 我应该见您的大多数要求虽然很好的工作与视作为网络的形式。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top