我如何实施一个质"loading..."页面ASP.NET 视?
-
22-07-2019 - |
题
我有一个 SearchController 与行动,可以执行一些长期运行的搜索和返回的一个结果页面上。搜索可以采取任何地方从1到60秒。网址的搜索是一个HTTP得到请求的形式: http://localhost/Search?my=query&is=fancy
体验我正在寻找类似于许多旅游网站。我想给一个中间"Loading..."页面,在那里, 理想的情况是:
- 用户可以重新载入页面没有重新启动搜索
- 一旦回端搜索完成后,用户被重新定向的结果
- 经验降低于浏览器与JavaScript无障碍
- 后背的按钮/浏览记录,不应包括本质页。
- 在较短的情况下搜索(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表单为基础的解决方案,其中有各种例子在网:
- 执行长期运行的的任务 取得的进展吧ASP.NET (aspfree.com)
- 设计方式:异步等待 国家图案ASP.NET (MSDN)
我之前已经建立了一个执行基于第一个链接上网的形式。基本过程为:
- 初始请求页w/搜索参数
- 这一页开始了一个新的螺纹其执行的长期运行的任务
- 这页重定向用户"下处理"网页,其中有一个http刷新标题置于重新装载,每隔几秒钟
- 线进行搜索,更新"全球"静态的搜索进行的对象的指示%完成,而下的过程页读取它,显示的进展。(每个搜索存储由GUID id在Hashtable,所以多个并行搜索的支持)
- 一旦完成在线更新的搜索进展如时下的流程页检测到这一点,它重定向到一个最终的"结果"页面。
(一定要检查的第二链接,从MSDN,这是相当不同的解决办法,但不是一个我只有脱脂。)
这样做的好处是,它不需要Javascript。最大的缺点我能想到的(从用户的角度看)是,它不是完全的"Web2.0",用户将需要等待通过一系列的浏览器刷新。
东西基于@Jan Willem B的AJAX的基础的建议应该是一个可行的替代这种多螺纹等待状态的模式。其中最能满足您的要求是什么你得决定对你自己的。例从aspfree.com 我应该见您的大多数要求虽然很好的工作与视作为网络的形式。