3

ユーザーがファイルをアップロードし、サーバーがファイルを処理し、検証済み、インポート済みなどの処理ステータスに関するリアルタイム通知をクライアントに表示する機能を実装しようとしています。クライアントがテキストボックスから JavaScript プロキシにデータを送信する例があります。 .

 $("#btnTest").click(function () {
                myHub.testMethodOnHub($("#txtEmail").val());
            });

サーバーがそのデータを処理し、SignalR を使用してクライアントに通知できるように、signalR を介してサーバーにバイナリ データを送信する必要があります。

編集:- aspx.cs から JS メソッドを呼び出して、クライアント側のステータスをリアルタイムに設定することができました。ただし、ページの読み込みが完了すると、メッセージは消えます。

私が試したこと:-

ASPX :-

<%@ Page Title="Home Page" Language="C#" AutoEventWireup="true"
    CodeBehind="Default.aspx.cs" Inherits="MultipleStepsUsingSignalR._Default" %>

<script src="Scripts/jquery-1.6.4.js" type="text/javascript"></script>
<script src="Scripts/json2.js" type="text/javascript"></script>
<script src="Scripts/jquery.signalR-0.5.2.js" type="text/javascript"></script>
<script src="signalr/hubs" type="text/javascript"></script>
<body>

    <form id="Form1" runat="server">
    <p>
        <asp:FileUpload ID="fileUpload" runat="server" />
        <asp:Button ID="btnProcessFile" runat="server" Text="Process File" 
            onclick="btnProcessFile_Click" />
        <asp:HiddenField ID="hdnConnectionId" runat="server"/>
        <%--<asp:Label Text="" ID="lblStatus" runat="server" />--%>
        <span id="lblStatus"></span>
    </p>

  </form>
    <script type="text/javascript">
        $(document).ready(function () {
            var multipleStepsHub = $.connection.multipleStepsHub;

            multipleStepsHub.MethodInJavascript = function (status) {
                $('#lblStatus').append(status);
            };

            $.connection.hub.start().done(function () {
                $('#<%= hdnConnectionId.ClientID %>').val($.connection.hub.id);
                alert($('#lblStatus').text());
            });
        });
    </script>
  </body>

ハブ

[HubName("multipleStepsHub")]
    public class MultipleStepsHub : Hub
    {
        public void ExecuteMultipleSteps(string status)
        { 

        }
    }

aspx の分離コード

   protected void btnProcessFile_Click(object sender, EventArgs e)
        {
            string connectionId = hdnConnectionId.Value;
            var context = GlobalHost.ConnectionManager.GetHubContext<MultipleStepsHub>();

            byte[] dataFromPostedFile = GetDataFromUploadedFile(fileUpload.PostedFile.InputStream);
            context.Clients[connectionId].MethodInJavascript("<br>File updloaded.");
            Thread.Sleep(5000);
            context.Clients[connectionId].MethodInJavascript("<br>Processing step1");
            Thread.Sleep(5000);
            context.Clients[connectionId].MethodInJavascript("<br>Processing step2");
            Thread.Sleep(5000);
            context.Clients[connectionId].MethodInJavascript("<br>Processing step3");

        }

何が期待されますか :- ステータス テキストが「Processing step1」、「Processing step2」、「Processing step3」の順に変化する

結果は何ですか:-

a) 定期的に (Thread.Sleep 後) ステータスに変化がありますが、ページが終了するとステータスは消えます。以下でわかるように、「Processing step1」と「Processing step2」は表示されますが、後で消えます。

ここに画像の説明を入力

4

3 に答える 3

3

JavaScriptメソッドに誤りがあります。

multipleStepsHub.MethodInJavascript = function (status) {
            ("#lblStatus").val(status);
};

する必要があります

multipleStepsHub.MethodInJavascript = function (status) {
            $('#<%= lblStatus.ClientID %>').text(status);
};

ASP.NETはHTML要素識別子を自動生成することに注意してください。

編集:アップロードの終了後にページをリロードしたくない場合は、ファイルを非同期でアップロードする必要があります。HTML5では、達成するのは非常に簡単です。それを行う方法の別の例については、この質問を参照してください。

于 2012-08-05T19:50:36.023 に答える
0

protected void btnProcessFile_Click is a full postback to the server which means you are reloading the page and at this time SignalR is not yet (re)loaded. Try using Ajax requests after the page load has finished.

于 2013-11-22T09:48:59.480 に答える