2013-09-18 1 views
1

Я работаю над приложением, с помощью которого любые изменения в базе данных будет обновлять веб-страницы в режиме реального времени без обновления страницы с помощью 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].

Есть, так или иначе, я могу исправить это и сделать свое приложение работой.

ответ

1

Кажется, вы имеете следующее заявление в верхней части вашего View:

@model IEnumerable<GridMvcSignalR.Models.JobInfoRepository> 

Попробуйте изменить его на:

@model List<GridMvcSignalR.Models.JobInfo> 
+0

Когда я сделал выше изменения. его перенаправление меня на пустую страницу. Можете ли вы просмотреть его. – DoIt

+0

@Dayakar Почему вы думаете, что он перенаправляет вас? Вы видите другой адрес? Возможны две причины. 1) У вас есть некоторая ошибка на вашей странице, и она перенаправляет вас на страницу с ошибкой. 2) У вас нет контента в вашем индексном представлении. Вы показываете только javascript. Есть ли у него что-то еще? –

+0

@Dayakar 3) Иногда это происходит, если ваш браузер блокирует jquery. Затем вам нужно добавить ссылку jquery прямо на эту страницу –

 Смежные вопросы

  • Нет связанных вопросов^_^