2011-12-27 13 views
6

Ostatni moduł skryptu do czatu przekazuje wartości z kodu C# do JavaScript, a JavaScript będzie podawał wartości do DIV. Zanim użyłem DataBinder, ale używając go bezpośrednio kod C# jest pobierany przez panel aktualizacji AJAX. Teraz potrzebuję zestawu wartości Array, które zostaną przekazane za pomocą funkcji Timer Tick do JavaScript. Jak mogę przekazać tablice z języka C# do JavaScript za pomocą <%= %>. Część mojego kodu następuje.Dodawanie wartości z C# do DIV za pośrednictwem JavaScript

protected void Timer1_Tick(object sender, EventArgs e) 
    { 
     if (MyConnection.State == System.Data.ConnectionState.Open) 
     { 
      MyConnection.Close(); 
     } 
     MyConnection.Open(); 
     OdbcCommand cmd = new OdbcCommand("Select message from messages where name=?", MyConnection); 
     cmd.Parameters.Add("@email", OdbcType.VarChar, 255).Value = "human"; 
     OdbcDataReader dr = cmd.ExecuteReader(); 
     ArrayList values = new ArrayList(); 
     while (dr.Read()) 
     { 
      string messagev = dr[0].ToString(); 
      // What should I do here? 
     } 
     MyConnection.Close(); 
    } 

Nie chcę, aby wartości były bezpośrednio wysyłane do DIV. Najpierw musi zostać wysłany do JavaScript, a następnie musi przejść do DIV.

Dalsze wyjaśnienia

trzeba C#, aby odzyskać dane z silnikiem i do przekazywania tych danych na stronie klienta (to JavaScript) z JavaScript ma on być przekazany do warstwy DIV.

+2

Możesz być zainteresowany tym postem na blogu: http://www.hanselman.com/blog/AsynchronousScalableWebApplicationsWithRealtimePersistentLongrunningConnectionsWithSignalR.aspx – Guillaume86

+0

Javascript i HTML to ta sama warstwa. Tag 'DIV' jest po prostu tagiem w twoim znaczniku HTML. Wykonaj połączenie AJAX z aplikacją ASP.Net, odinstaluj zserializowane dane (JSON lub XML), a następnie użyj Javascript, aby załadować DIV. –

Odpowiedz

13

mam zamiar zaproponować podejście jQuery i pozbyć timer po stronie serwera. Używając JQuery i wtyczki JQuery.Timer: http://code.google.com/p/jquery-timer/ możesz zrobić to łatwiej, moim zdaniem, i będzie ładniej na końcu klienta.

na stronie aspx masz element, aby wyświetlić wyjściowa:

<span id="status" style="display:none"></span> 

a także odniesienie do jQuery JQuery.Timer.js, a następnie swój kod, aby zadzwonić do C# metodę internetową.

<script src="js/jquery-1.7.1.min.js" type="text/javascript"></script> 
<script src="js/jquery.timer.js" type="text/javascript"></script> 
<script> 
    $(function() { 
     var timer = $.timer(getMessage, 10000); 
     timer.play(); 
    }) 

    function getMessage() { 
     $.ajax({ 
      type: 'POST', 
      contentType: 'application/json; charset=utf-8', 
      url: 'message-service.asmx/getDBMessages', 
      data: "{}", 
      dataType: 'json', 
      success: getMessageSuccess, 
      error: getMessageError 
     }) 
    } 

    function getMessageError(jqXHR, textStatus, errorThrown) { 
     $('#status').html(errorThrown).show(); 
    } 

    function getMessageSuccess(data, textStatus, jqXHR) { 
     $('#status').html(data.d).show(); 
    } 
</script> 

użyłbym internetowy serwis po stronie serwera komunikatów db pobierania:

[WebService(Namespace = "http://site.com/service")] 
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
[System.Web.Script.Services.ScriptService] 
public class contact_service : System.Web.Services.WebService 
{ 

    [WebMethod] 
    public string getDBMessages() 
    { 
     try 
     { 
if (MyConnection.State == System.Data.ConnectionState.Open) 
     { 
      MyConnection.Close(); 
     } 
     MyConnection.Open(); 
     OdbcCommand cmd = new OdbcCommand("Select message from messages where name=?", MyConnection); 
     cmd.Parameters.Add("@email", OdbcType.VarChar, 255).Value = "human"; 
     OdbcDataReader dr = cmd.ExecuteReader(); 
     ArrayList values = new ArrayList(); 
     while (dr.Read()) 
     { 
      string messagev = dr[0].ToString(); 
     } 
     MyConnection.Close(); 
return messagev; 
     } 
     catch (Exception ex) 
     { 
      return ex.Message; 
     } 
    } 

Mam nadzieję, że to ma sens. Stworzyłem serwer WWW (asmx) i stworzył mój kod po stronie serwera, aby zwrócić ciąg znaków. W znacznikach aspx używam JQuery do uruchomienia timera na 10 sekund, a następnie posta .ajax do odpytywania usługi, pobrania wiadomości i wyświetlenia jej. Żadne odświeżanie strony i dużo mniej hacky z mojej perspektywy.

+0

Nie będę mieć wywołań bazy danych w ramach obsługi żądania internetowego. Zasadniczo nie jest skalowalny. Zostawiłbym kod żądania DB oparty na zegarze programistycznym takim jaki jest, ale zapełniłby on jakąś pamięć podręczną. Mają metodę webową, ponieważ wywołanie ajaxowe, które dodałeś powyżej, pobiera dane z pamięci podręcznej. – musaul

+1

Uzgodniono, ale dla celów zadanego pytania nie chciałem odejść od pierwotnej implementacji db za daleko, wybierając po prostu skopiować/wkleić jego już napisany kod po stronie serwera do metody internetowej. – justinlabenne

+0

Otrzymuję komunikat "Wewnętrzny błąd serwera" :( –

4

Zakładając identyfikator Twojego div jest div1, można wykonać następujące

div1.Controls.Add(new LiteralControl(dr[0].ToString()) + "<br />"); 

To doda tekst wiadomości do Div

+0

To jest dobry pomysł, ale otrzymuję komunikat o błędzie "Nazwa div1" nie istnieje w bieżącym kontekście. Oczywiście moja nazwa DIV to div1. –

+0

@Madcode. Dodaj runat = "server" do div1, tak:

. –

+1

@GuilhermeJSantos, Shai - Dzięki! Działa, ale podczas używania '+"
"' Otrzymuję błąd 'nieprawidłowe argumenty' kiedy go usuwam, działa, ale nie ma nowej linii do rozdzielenia. –

4

Istnieją dwa sposoby, aby dostać coś w kodzie JavaScript. Możesz wywołać wywołanie ajax z javascript i zwrócić serwerowi to, czego potrzebujesz (jako normalny ciąg lub może jako JSON). Lub możesz dynamicznie budować kod javascript na serwerze na oryginalnym zleceniu. Patrząc na twój kod, myślę, że pierwszą metodą jest droga. Więc zamiast funkcji timera na serwerze, napisz funkcję czasu w javascript i odpytuj serwer przez ajax dla nowych wiadomości.

+0

Yah, SignalR to prawdopodobnie droga. To po prostu wygląda na nieoptymalne dla mnie, z timerem po stronie serwera ... chyba, że ​​używają tego tylko 2-3 osoby. Jeśli SignalR nie zadziała, należy użyć ankiety po stronie klienta + AJAX. – kamranicus

2

Po prostu myśl; możesz używać Flasha lub apletu do komunikacji z gniazdem do javascript. Implementacja websocket dla Flash znajduje się tutaj: https://github.com/y8/websocket-as. Może być fajna na czat, może nawet przesada, zależy.

+0

To może być bardziej skomplikowane! –

+0

https://github.com/gimite/web-socket-js dla wersji Flash – RobotRock

0

Proponuję użyć opcji Długie pobieranie, aby uzyskać powiadomienie push. Przeczytaj o długim Polling z here

można znaleźć wspaniały przykład here, co wyjaśnia zarówno po stronie serwera i po stronie klienta implementation. Jeśli Twój są przy użyciu HTML 5, proponuję rzucić okiem na Web Sockets

technologii po stronie serwera można używać C#, ale pewna node.js podejmuje wszystkie właściwe dźwięki dla tego rodzaju pracy

0

Co się stanie, jeśli użyjesz ukrytego kontrolki HTML na stronie ustawionej w metodzie Timer1_Tick i użyjesz jej do odczytania wartości w funkcji javascript. hiddenControl.Text = dr[0].ToString(); A następnie w funkcji javascript var data = document.getElementById('hiddenControl').value A tutaj możesz dodać te dane do swojego div, jak tylko chcesz.

0

Użyj ScriptManager do zarejestrowania bloku skryptu klient ..

ScriptManager.RegisterClientScriptBlock(
       this.Page, 
       this.GetType(), 
       "WebUserControlSript", 
       "FunctionABC('" + messagev + "')", 
       true); 

A w .aspx stronę kliknąć na poniższy skrypt:

FunctionABC(message) 

{ 
    append "message" to div here.. 
} 

Dzięki,

Pozdrowienia,

Dhaval Shukla

+0

Dzięki za twój kod Mr.Dhaval. Po stronie klienta ten kod ' 'będzie wystarczający? Ale ten JavaScript nie działa, możesz mi pomóc w jego budowaniu. –

+0

Czy możesz spróbować, używając następującego kodu: funkcja FunctionABC (wiadomość) { alert (wiadomość); $ ('# abc'). Html (wiadomość); }

trzeba napisać div poza forma tagu Inorder aby to działało .. –

+0

Należy pamiętać, że w wyżej dany przykład komentarza Mam zarejestrowany clientcript na kliknięciu przycisku .. –

Powiązane problemy