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