我正在asp.net mvc 5中开发一个应用程序。在这个项目中,我使用signalR来实时显示更新的数据。这意味着当任何数据发生变化时,它将在应用程序UI中加载。但不幸的是,除非我刷新页面,否则它不会自动加载。
以下是我的代码:
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 () {
});
}
答案 0 :(得分:0)
您需要更改客户端脚本和集线器类方法。 在hub方法中,您需要将GetExportStatus方法作为参数传递,以便集线器将数据发送到所有客户端:
[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.
}
}
您可以参考以下链接进行跨域: enter link description here
答案 1 :(得分: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());
}
}