我正在努力解决在 ASP MVC 应用程序中刷新表中每一行的问题。
我有一个对象列表,其中每个对象都包含一个 url 和 refreshTime。应用程序应该提供一个表格,其中每一行代表列表中的每个对象。对于每一行,它必须检查 url 是否仍然可用。每行都有不同的刷新时间。
我的问题是我不知道如何使用 Javascripts 来做到这一点。我尝试使用 jQuery、Ajax 但失败了。我知道如何使用 Js 刷新所有表,但是如何使用不同的刷新时间分别刷新每一行?
我正在努力解决在 ASP MVC 应用程序中刷新表中每一行的问题。
我有一个对象列表,其中每个对象都包含一个 url 和 refreshTime。应用程序应该提供一个表格,其中每一行代表列表中的每个对象。对于每一行,它必须检查 url 是否仍然可用。每行都有不同的刷新时间。
我的问题是我不知道如何使用 Javascripts 来做到这一点。我尝试使用 jQuery、Ajax 但失败了。我知道如何使用 Js 刷新所有表,但是如何使用不同的刷新时间分别刷新每一行?
如果您有下表:
<table border=1>
<thead>
<td class="url">Url</td>
<td class="interval">Interval</td>
<td class="status">Status</td>
</thead>
<tbody>
<tr>
<td class="url">http://www.google.com</td>
<td class="interval">2000</td>
<td class="status"></td>
</tr>
<tr>
<td class="url">http://www.bing.com</td>
<td class="interval">5000</td>
<td class="status"></td>
</tr>
</tbody>
</table>
您可以使用以下 jQuery 代码片段单独更新每一行:
$("tbody tr").each(function () {
var row = $(this);
var interval = row.find(".interval").text();
setInterval(function(){updateRow(row);}, interval);
});
function updateRow(row) {
var url = row.find(".url").text();
var statusCell = row.find(".status");
statusCell.text("last checked: " + new Date().toLocaleString());
var checking = $.post('/api/statuses', { "": url });
checking.done(function (data) {
var responding = data;
if (responding) {
statusCell.css("background", "green");
} else {
statusCell.css("background", "red");
}
});
}
也可在http://jsfiddle.net/hummlas/pyh9c/
实际的状态检查有点复杂,但由于您不允许进行跨域 ajax 调用,您可以通过使用代理来解决这个问题,例如创建一些服务器端代码来进行状态检查,然后您只需 ajax 使用您想要获取其状态的 url 调用您的代理。
编辑:
我添加了一个使用 ASP.NET Web API 控制器的状态检查代理服务的示例实现
public class StatusesController : ApiController
{
[HttpPost]
public bool Post([FromBody]string value)
{
return CheckStatus(value);
}
private bool CheckStatus(string url)
{
var request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "HEAD"; //only retrieve headers
HttpWebResponse response;
try
{
response = (HttpWebResponse)request.GetResponse();
}
catch (WebException e)
{
response = (HttpWebResponse) e.Response;
}
var responseCode = (int)response.StatusCode;
return responseCode < 400; //erroneus response codes starts at 400
}
}