1

ASP MVC アプリケーションのテーブルの各行を更新する問題に苦労しています。

各オブジェクトに url と refreshTime が含まれているオブジェクトのリストがあります。アプリケーションは、各行がリストの各オブジェクトを表す表を提示する必要があります。行ごとに、URL がまだ利用可能かどうかを確認する必要があります。各行には異なる refreshTime があります。

私の問題は、Javascript を使用してこれを行う方法がわからないことです。jQuery、Ajaxを使ってみましたがだめでした。Jsを使用してすべてのテーブルを更新する方法は知っていますが、それぞれに異なる更新時間を使用して各行を個別に更新する方法は?

4

1 に答える 1

1

次のテーブルがある場合:

<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 呼び出しを行うことは許可されていないため、プロキシを使用してそれを回避できます。たとえば、ステータス チェックを実行するサーバー側コードを作成してから、ステータスを取得したい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
    }

}
于 2013-04-28T18:14:23.137 に答える