2016-01-26 3 views
0

Мой DiaryHub.vb имеет следующее:Вызов функции SignalR Javascript из модального всплывающего окна

Imports Microsoft.AspNet.SignalR 
Imports Microsoft.AspNet.SignalR.Hubs 

Namespace UIS 

    <HubName("DiaryHub")> 
    Public Class DiaryHub 
     Inherits Hub 

     Public Sub PostDiaryHeadline() 
      ' Call the addNewMessageToPage method to update clients. 
      Clients.All.addNewDiaryHeadlineToPage() 
     End Sub 

    End Class 

End Namespace 

Мое окно Главная/Индекс имеет следующий код для инициирования/настройки SignalR.

$(function() { 

    // Save the reference to the SignalR hub 
    var dHub = $.connection.DiaryHub; 

    // Invoke the function to be called back from the server 
    // when changes are detected 
    // Create a function that the hub can call back to display new diary Headline entry. 
    dHub.client.addNewDiaryHeadlineToPage = function() { 
     // refresh the Headline Entries to the page. 
     outputHLDiaryEntries(); 
    }; 

    // Start the SignalR client-side listener 
    $.connection.hub.start().done(function() { 
     // Do here any initialization work you may need 
     outputHLDiaryEntries(); 
    }); 

}) 

Код работает и при запуске отображаются записи дневника дневного света.

У меня также есть кнопка, которая открывает окно Кендо как модальный с формой для добавления новых записей дневника с помощью этой функции:

function openAddWindow() { 
    var addWindow = $("#window").data("kendoWindow"); 
    addWindow.refresh({ 
     url: "Home/AddDiaryEntry/" 
    }); 
    addWindow.open(); 
    addWindow.center(); 
} 

Я тогда следующий Javascript в моей странице AddDiaryEntry:

function createDiaryEntry() { 

    var validFlag = true; 
    var errorMsg = ""; 

    //Validate New Diary Entry 
    // removed for brevity... 

    if (validFlag) { 
     //data is valid 

     //get value of checkbox 
     var cbValue = ($("#addNew_dHeadline").is(':checked')) ? true : false; 

     //clear error area 
     $('#errorArea').html(""); 

     var response = '' 
     $.ajax({ 
      url: 'Home/SaveDiaryEntry', 
      type: 'POST', 
      data: { 
       dDate: $("#addNew_dDate").text(), 
       dCreatedBy: $("#addNew_dCreatedBy").text(), 
       dName: '@AppShort', 
       dTeam: teamValue.value(), 
       dType: typeValue.value(), 
       dRef: $("#addNew_dREF").val(), 
       dHeadline: cbValue, 
       dServer: multiSelect.value(), 
       dComment: editor.value() 
      }, 
      success: function (result) { 
       response = result; 
       alert(response); 
      }, 
      error: function (XMLHttpRequest, textStatus, errorThrown) { 
       response = "err--" + XMLHttpRequest.status + " -- " + XMLHttpRequest.statusText + " -- " + errorThrown; 
       alert(response); 
      } 
     }); 

     //close window 
     var addWindow = $("#window").data("kendoWindow"); 
     addWindow.close(); 

     //if headline entry call SignalR post function to refresh diary entries 
     if (cbValue) { 

      // reference to the SignalR hub 
      var dHub = $.connection.DiaryHub; 
      // function to update all clients 
      dHub.client.PostDiaryHeadline(); //THIS IS A FUNCTION IN DiaryHub.vb 
     } 

    } else { 
     //error in data 
     var out = '<ul class="error">' + errorMsg + '</ul>'; 
     // display errors 
     $('#errorArea').html(out); 
    } 

} 

Код работает нормально - проверяет данные, сохраняет данные в базе данных. Проблема, с которой я сталкиваюсь, заключается в попытке вызвать dHub.client.PostDiaryHeadline() для вызова функции SignalR. Я получаю сообщение об ошибке: JavaScript runtime error: Object doesn't support property or method 'PostDiaryHeadline'

Как я могу назвать функцию? Должен ли я вызвать функцию до закрытия модального окна?

+0

не было бы: dHub.server.PostDiaryHeadline(); ? –

+0

@TezWingfield Попробовал ваше предложение и получил ту же ошибку. Объект не поддерживает свойство или метод – Mych

+0

Позвольте мне исправить свой ответ, и я вернусь к вам. –

ответ

1

Из чего я вижу, что вы действительно ожидаете ответа, а не вызова сервера. , добавив server, уволит запрос.

if (cbValue) { 

     // reference to the SignalR hub 
     var dHub = $.connection.DiaryHub; 
     // function to update all clients 
     dHub.server.PostDiaryHeadline(); //THIS IS A FUNCTION IN DiaryHub.vb 
    } 

Вы уже получаете ответ здесь:

dHub.client.addNewDiaryHeadlineToPage = function() { 
     // refresh the Headline Entries to the page. 
     outputHLDiaryEntries(); 
    }; 

// EDIT

Там, кажется, небольшие проблемы путем, так что помимо вышеуказанного (которая нуждается в установке).

На имя концентратора (бэкэнд) заменить с: <HubName("diaryHub")>

В ваших JS заменить: var dHub = $.connection.diaryHub;

Наконец в вашем createDiaryEntry(); тело должно выглядеть так:

$.connection.hub.start().done(function() { 
     // Do here any initialization work you may need 
    if (cbValue) { 
     // reference to the SignalR hub 
     var dHub = $.connection.diaryHub; 
     // function to update all clients 
     dHub.server.postDiaryHeadline(); //THIS IS A FUNCTION IN DiaryHub.vb 
     } 
    }); 

Есть целый несколько проблем SignalR, но это должно привести вас к правильному пути.

Большинство проблем SignalR обусловлены чувствительностью к регистру и структурированием. Все очень распространено.

Должен быть последним вопросом, заменить: dHub.server.postDiaryHeadline(); строчных "р"

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