none
Servercontrol, jQuery und Werte von Hiddenfields RRS feed

  • Frage

  • Hallo beisammen!

    Sorry für den sperrigen Titel, aber mein Problem ist vielschichtig ;-)

    Ich habe mir ein Compsit-Control gebaut, welches eine Autocompletebox (ala Suchmaschine) bereitstellt. Die Ajax-Seite zum Holen der Datenbankeinträge ist mit jQuery gestrickt. Und das sieht folgendermaßen aus:

    $(function() {
      $("#salutationLetter_TextBox").autocomplete({
         source: function(request, response) {
           $.ajax({
           url: "/webservices/AutoComplete.asmx/GetSalutationsLetter",
           data: "{ 'term': '" + request.term + "', 'rowCount': 10}",
           dataType: "json",
           type: "POST",
           contentType: "application/json; charset=utf-8",
           dataFilter: function(data) { return data; },
           success: function(data) {
             response($.map(data.d, function(item) {
               return {
                 label: item.Value,
                 value: item.Key
               }
             }))
           }
         });
       },
       minLength: 1,
       select: function(event, ui) {
         $("#salutationLetter_TextBox").val(ui.item.label);
         $("#HiddenField").val(ui.item.value);
         return false;
         }
       });
     });

    Das Control besteht also nur aus zwei Controls, einem Textfeld und einem Hiddenfield.
    Im Hiddenfield wird die ID des Datensatzes hinterlegt, welcher angewählt wurde.
    Soweit klappt das sehr schön und ich kann auch auf dem Client nachvollziehen, dass die ID in das HiddenField geschrieben wird.

    Nun wollte ich die ID (besser gesagt dessen Value) per Property nach außen durchschleifen. Mein Control hat also folgendes im Codebehind:

     

     

        Public Property Key() As String
          Get
            EnsureChildControls()
            Return _hiddenField.Value
          End Get
          Set(ByVal value As String)
            EnsureChildControls()
            _hiddenField.Value = value
          End Set
        End Property
    
    
        Public Property Text() As String
          Get
            EnsureChildControls()
            Return _textBox.Text
          End Get
          Set(ByVal value As String)
            EnsureChildControls()
            _textBox.Text = value
          End Set
        End Property

     

    Und das klappt (natürlich) nicht. Ich habe mittlerweile kapiert, dass die Daten aus dem Clientscript nicht an den Viewstate des Controls weitergegeben werden und mein hübsches Hiddenfield beim Reload der Seite einfach wieder mit Leerstring initialisiert wird.
    Bleibt die Frage, was tun? Es muss doch irgendeine Lösung für das Problem geben?!? Ich habe das (gefühlte) halbe Internet durchsucht und keine brauchbare Antwort gefunden. Jetzt seid Ihr meine letzte Hoffnung ;-)

    Viele Grüße und TIA

    Thomas

     

    Dienstag, 6. Juli 2010 18:49

Alle Antworten

  • Hallo Thomas,

    Und das klappt (natürlich) nicht. Ich habe mittlerweile kapiert, dass die Daten aus dem Clientscript nicht an den Viewstate des Controls weitergegeben werden und mein hübsches Hiddenfield beim Reload der Seite einfach wieder mit Leerstring initialisiert wird.
    Bleibt die Frage, was tun? Es muss doch irgendeine Lösung für das Problem geben?!? Ich habe das (gefühlte) halbe Internet durchsucht und keine brauchbare Antwort gefunden. Jetzt seid Ihr meine letzte Hoffnung ;-)


    wann setzt Du denn die Property "Key" und auf welchen Wert? Weil im Setter dieser Property überschreibst Du dir einen ggfs. übermittelten Wert wieder. Wenn dort dann "" ankommt, ist klar, warum das HiddenField auch leer ist.

    Du könntest die Property auch als ReadOnly deklarieren und dann halt eben nur den Wert aus _hiddenField.Value zurück geben. Aber wie gesagt, ich würde mal einen Breakpoint auf die Set Methode der Property setzen und schauen, wann dort was ankommt.

     


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community
    Dienstag, 6. Juli 2010 19:30
    Moderator
  • Hallo Stefan!

    Danke schon mal für Deine Antwort.
    Die Property steht erst mal nur so im Raum. Ist wie gesagt ein Composit-Control und vielleicht könnte man den Setter irgendwann einmal gut gebrauchen.
    Tatsächlich wird die Routine im vorliegenden Fall niemals angesprungen. Ich hatte fälschlicherweise erwartet, dass, wenn ich den Wert des Hiddenfields per Javascript setze, ich diesen Wert beim Postback über die Property zurückerhalten würde.
    Genau das ist aber nicht der Fall. Macht beim zweiten Nachdenken ja auch durchaus Sinn, das Control wird ja beim "CreateChildControl"-Event nach einem Postback der Page auf der das Control sitzt neu erzeugt.

    Nichts desto trotz brauche ich diesen Wert irgendwie als Eigenschaft des Controls. Ansonsten ist es hübsch, aber sinnlos.
    Ergo muss ich irgendwie diesen Wert ins Viewstate bekommen.
    Meine erste Überlegung ging in Richtung Ajax. Also den erhaltenen Wert per jQuery nicht ins DOM zu schreiben, sondern per AJAX an eine Methode des Controls zu übergeben. Da mir das aber als recht kompliziert erscheint - und ich ehrlich gesagt keine Ahnung habe wie ich das anstellen soll - suche ich nach weiteren Varianten.

    Viele Grüße

    Thomas

    Mittwoch, 7. Juli 2010 06:27