Я работаю над приложением, с помощью которого любые изменения в базе данных будет обновлять веб-страницы в режиме реального времени без обновления страницы с помощью SignalRобновления базы данных изменений в ASP.Net MVC 4 с использованием SignalR и SqlDependency
после кода I я использую
1. Модель
public class JobInfo
{
public int ID { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
public class JobInfoRepository
{
public IEnumerable<JobInfo> GetData()
{
using (var connection = new SqlConnection(ConfigurationManager.ConnectionStrings["AtlasTest"].ConnectionString))
{
connection.Open();
using (SqlCommand command = new SqlCommand(@"SELECT [ID],[FirstName],[LastName]
FROM [dbo].[Persons]", connection))
{
// Make sure the command object does not already have
// a notification object associated with it.
command.Notification = null;
SqlDependency dependency = new SqlDependency(command);
dependency.OnChange += new OnChangeEventHandler(dependency_OnChange);
if (connection.State == ConnectionState.Closed)
connection.Open();
using (var reader = command.ExecuteReader())
return reader.Cast<IDataRecord>()
.Select(x => new JobInfo()
{
ID = x.GetInt32(0),
FirstName = x.GetString(1),
LastName = x.GetString(2)
}).ToList();
}
}
}
private void dependency_OnChange(object sender, SqlNotificationEventArgs e)
{
JobHub.Show();
}
}
2. контроллер
public class AppController : Controller
{
//
// GET: /App/
JobInfoRepository objRepo = new JobInfoRepository();
public ActionResult Index()
{
return View(objRepo.GetData());
}
}
3. Вид
$(function() {
// Proxy created on the fly
var job = $.connection.jobHub;
// Declare a function on the job hub so the server can invoke it
job.client.displayStatus = function() {
getData();
};
// Start the connection
$.connection.hub.start();
getData();
});
function getData() {
var $tbl = $('#Persons');
$.ajax({
url: '../api/values',
type: 'GET',
datatype: 'json',
success: function (data) {
if (data.length > 0) {
$tbl.empty();
$tbl.append(' <tr><th>ID</th><th>FirstName</th><th>Last Name</th></tr>');
var rows = [];
for (var i = 0; i < data.length; i++) {
rows.push(' <tr><td>' + data[i].ID + '</td><td>' + data[i].FirstName + '</td><td>' + data[i].LastName + '</td></tr>');
}
$tbl.append(rows.join(''));
}
}
});
}
4. SignalR Class Hub
public class JobHub : Hub
{
public static void Show()
{
IHubContext context = GlobalHost.ConnectionManager.GetHubContext<JobHub>();
context.Clients.All.displayStatus();
}
}
5. Global.asax.cs
protected void Application_Start()
{
RouteTable.Routes.MapHubs();SqlDependency.Start(ConfigurationManager.ConnectionStrings["AtlasTest"].ConnectionString);
AreaRegistration.RegisterAllAreas();
WebApiConfig.Register(GlobalConfiguration.Configuration);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
При запуске вышеуказанного кода и перехода по ссылке ..//App/Index. Я получил ошибку follwing
Ошибка сервера в '/' Application.
Модели элемент передается в словарь типа 'System.Collections.Generic.List
1[GridMvcSignalR.Models.JobInfo]', but this dictionary requires a model item of type 'System.Collections.Generic.IEnumerable
1 [GridMvcSignalR.Models.JobInfoRepository].
Есть, так или иначе, я могу исправить это и сделать свое приложение работой.
Когда я сделал выше изменения. его перенаправление меня на пустую страницу. Можете ли вы просмотреть его. – DoIt
@Dayakar Почему вы думаете, что он перенаправляет вас? Вы видите другой адрес? Возможны две причины. 1) У вас есть некоторая ошибка на вашей странице, и она перенаправляет вас на страницу с ошибкой. 2) У вас нет контента в вашем индексном представлении. Вы показываете только javascript. Есть ли у него что-то еще? –
@Dayakar 3) Иногда это происходит, если ваш браузер блокирует jquery. Затем вам нужно добавить ссылку jquery прямо на эту страницу –