0

I am developing an application in asp.net mvc 5. In this project I'm using signalR to show the updated data in real time. That means when any data will change than it will be loaded in application UI. But unfortunately it's not loaded automatically unless I refresh the page.

Here is my code below :

Hub :

[HubName("statusLog")]
public class StatusLogHub : Hub
{

    [HubMethodName("sendExportStatus")]
    public void SendExportStatus()
    {
        IHubContext context = GlobalHost.ConnectionManager.GetHubContext<StatusLogHub>();
        Clients.All.updateStatus();
    }
}

Repository :

public class EmailStatusLogRepository
{

    readonly string _connString = ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString;

    public IEnumerable<EmailStatusLog> GetExportStatus()
    {
        var messages = new List<EmailStatusLog>();
        using (var connection = new SqlConnection(_connString))
        {
            connection.Open();
            using (var command = new SqlCommand(@"SELECT * FROM dbo.EmailStatusLogs WHERE ExportStatus = 1 AND CAST(CONVERT(VARCHAR,Date,101) AS DATETIME)=CAST(CONVERT(VARCHAR,'" + DateTime.Now.Date.ToString("MM/dd/yyyy") + @"',101) AS DATETIME)", connection))
            {
                command.Notification = null;

                var dependency = new SqlDependency(command);
                dependency.OnChange += new OnChangeEventHandler(dependency_OnChange);

                if (connection.State == ConnectionState.Closed)
                    connection.Open();

                var reader = command.ExecuteReader();

                while (reader.Read())
                {
                    messages.Add(item: new EmailStatusLog { Id = (int)reader["Id"], Investor_Code = (string)reader["Investor_Code"], EmailId = reader["EmailId"] != DBNull.Value ? (string)reader["EmailId"] : "", Date = (string)reader["Date"], ReportName = (string)reader["ReportName"], ExportStatus = (bool)reader["ExportStatus"], EmailSendStatus = (bool)reader["EmailSendStatus"], IsActive = (bool)reader["IsActive"] });
                }
            }

        }
        return messages;
    }
    private void dependency_OnChange(object sender, SqlNotificationEventArgs e)
    {
        if (e.Type == SqlNotificationType.Change)
        {
            StatusLogHub statusLogHub = new StatusLogHub();
            statusLogHub.SendExportStatus();
        }
    }

}

//Code from where I am updating DB:

public void ExportStatus()
    {
        List<EmailStatusLog> lstEmailStatusLog = new List<EmailStatusLog>();
        EmailStatusLog objEmailStatusLog = new EmailStatusLog();
        foreach (var emailItem in lstEmailReceipent)
        {
            EMailDBContext _ctx = new EMailDBContext();
            objEmailStatusLog.EmailId = emailItem.stEmailAdd;
            objEmailStatusLog.Investor_Code = emailItem.stInvestor_code;
            objEmailStatusLog.Date = DateTime.Now.ToString("MM/dd/yyyy");
            objEmailStatusLog.ReportName = reportName;
            objEmailStatusLog.ExportStatus = IsSuccess;
            objEmailStatusLog.EmailSendStatus = false;
            objEmailStatusLog.IsActive = true;
            _ctx.emailStatusLogs.Add(objEmailStatusLog);
            _ctx.SaveChanges();
            //StatusLogHub objStatusLogHub = new StatusLogHub();
            //objStatusLogHub.SendExportStatus();

        }
    }

Controller :

public ActionResult GetExportStatus()
    {
        EmailStatusLogRepository objEmailStatusRepository = new EmailStatusLogRepository();
        return PartialView("_exportedReportList", objEmailStatusRepository.GetExportStatus());
    }

Javascript: 

<script type="text/javascript" language="javascript">
//==================signalR
$(function () {
    var hub = $.connection.statusLog;
    hub.client.updateStatus = function () {
        getExportStatus()
    };
    $.connection.hub.start().done(function () {
        alert("connection started");
        // hub.server.sendExportStatus($('').val());
        getExportStatus();
    }).fail(function (e) {
        alert(e);
    });
});


function getExportStatus() {
    var tbl = $('#statusTable');
    $.ajax({
        url: '@Url.Action("GetExportStatus")',
        contentType: 'application/html ; charset:utf-8',
        type: 'GET',
        dataType: 'html'
    }).success(function (result) {
        tbl.empty().append(result);
    }).error(function () {

    });
}

4

2 回答 2

0

您需要更改客户端脚本和集线器类方法。在 hub 方法中,您需要将 GetExportStatus 方法作为参数传递,以便 hub 将数据发送到所有客户端:

[HubName("statusLog")]
public class StatusLogHub : Hub
{

    [HubMethodName("sendExportStatus")]
    public void SendExportStatus()
    {
        IHubContext context = GlobalHost.ConnectionManager.GetHubContext<StatusLogHub>();
        EmailStatusLogRepository el = new EmailStatusLogRepository();
                Clients.All.updateStatus(el.GetExportStatus());
    }
}

在客户端:

$(function()
        {
            var hub = $.connection.statusLog;
            hub.client.updateStatus = function(data) {
//data contain all the data from repository this will call every time as repository updated
                getExportStatus(data)
           };
    $.connection.hub.start().done(function() {
                //alert("connection started");
                hub.server.sendExportStatus();
            }).fail(function(e) {
                alert(e);
            });
        });


function getExportStatus(data)
        {
alert(data);
            //you can put here logic for getting data on html.
    }
}

您可以参考以下跨域链接: 在此处输入链接描述

于 2016-03-20T10:46:01.190 回答
0

您可以尝试客户端脚本:

$(function()
        {
            var hubstatusLog = $.connection.statusLog;
            hubstatusLog.client.updateStatus = function(data) {
//data contain all the data from repository this will call every time as repository updated
                getExportStatus(data)
           };
   $.connection.hub.start(function () {
hubstatusLog.server.sendExportStatus();
});
});

function getExportStatus(data)
        {
alert(data);
            //you can put here logic for getting data on html.
    }

服务器集线器:

    [HubName("statusLog")]
public class StatusLogHub : Hub
{

    [HubMethodName("sendExportStatus")]
    public void SendExportStatus()
    {
        IHubContext context = GlobalHost.ConnectionManager.GetHubContext<StatusLogHub>();
        EmailStatusLogRepository el = new EmailStatusLogRepository();
                Clients.All.updateStatus(el.GetExportStatus());
    }
}
于 2016-03-22T15:06:32.833 回答