2009-06-16 29 views
0

Ich habe eine ASP.NET-Anwendung, die jQuery verwendet. Meine ASP.NET-Anwendung generiert dynamisch einige HyperLink-Elemente basierend auf einigen Werten in einer Datenbank. Wenn ein Benutzer auf eines dieser HyperLink-Elemente klickt, möchte ich ein jQuery-Dialogfeld anzeigen, mit dem der Benutzer den HyperLink-Text bearbeiten kann. Ich habe diesen Teil in Arbeit.ASP.NET + jQuery + Dynamisch erstellte HyperLink-Steuerelemente

Wenn ein Benutzer auf die Schaltfläche "Speichern" klickt, muss ich die Werte der HyperLink-Elemente lesen und sie in der Datenbank speichern. Derzeit erhalte ich die Anfangswerte der HyperLink-Elemente. Ich kann jedoch keine modifizierten Werte erhalten. Wie bekomme ich die Werte, die vom Benutzer zur Verfügung gestellt wurden? Ich habe meine aspx und aspx.cs Code hier zu finden:

Test

Bericht:

<div id="recommendDialog" title="Number"> 
     <table border="0" cellpadding="0" cellspacing="0"> 
      <tr><td>Number</td></tr> 
      <tr><td><input id="optionName" type="text" /></td></tr> 
     </table> 
    </div> 

    <asp:Button ID="saveButton" runat="server" Text="Save" OnClick="saveButton_Click" /> 
</div> 
</form>  

<script type="text/javascript"> 
    var editingID = null; 

    $("#recommendDialog").dialog({ 
     autoOpen: false, 
     height: 200, 
     modal: true, 
     buttons: { 
      Cancel: function() { 
       $(this).dialog('close'); 
      }, 

      'OK': function() { 
       var newValue = $("#optionName").val(); 
       if (editingID != null) { 
        $(editingID).attr("name", newValue); 
        $(editingID).html(newValue); 
       } 
       $(this).dialog('close'); 
      } 
     }, 
     close: function() { 

     } 
    }); 

    function update_Click(link) { 
     editingID = "#" + link.id; 
     $("#optionName").val(link.name); 
     $('#recommendDialog').dialog('open');    
    } 
</script> 

Hier ist mein Code-behind:

public partial class _Default: System.Web.UI.Page { protected override void OnInit (EventArgs e) { base.OnInit (e); AddHyperlinks(); }

protected void Page_Load(object sender, EventArgs e) 
{} 

protected void saveButton_Click(object sender, EventArgs e) 
{ 
    foreach (TableCell cell in reportTable.Rows[0].Cells) 
    { 
     HyperLink h = (HyperLink)(cell.Controls[0]); 
     string newValue = h.Attributes["name"]; 

     // Save value to database here. newValue does not show 
     // changed values. 
     Console.WriteLine(newValue); 
    } 
} 

private void AddHyperlinks() 
{ 
    TableRow row = new TableRow(); 
    for (int i = 1; i < 11; i++) 
    { 
     HyperLink hyperlink = new HyperLink(); 
     hyperlink.NavigateUrl = "#"; 
     hyperlink.Text = i.ToString(); 
     hyperlink.Attributes.Add("id", "h" + i); 
     hyperlink.Attributes.Add("name", i.ToString()); 
     hyperlink.Attributes.Add("onclick", "update_Click(this);"); 
     AddLinkButtonToRow(hyperlink, row); 
    } 
    reportTable.Rows.Add(row); 
} 

private void AddLinkButtonToRow(HyperLink linkButton, TableRow row) 
{ 
    TableCell cell = new TableCell(); 
    cell.Controls.Add(linkButton); 
    row.Cells.Add(cell); 
} 

}

+0

Fehle ich den Teil, wo Sie die Datenbank aktualisieren? Sie müssen dies durch jQuery Ajax tun. – ScottE

+0

Übrigens, Dave: Ihr Code würde viel sauberer aussehen, wenn Sie Eingabefelder (TextBox) benutzen - es sieht so aus, als ob Sie nur 10 Strings lesen. – Kobi

Antwort

1

Was Sie versuchen, ist auf diese Weise nicht möglich. Sie erstellen bei jeder Erstellung der Seite Links. Obwohl Sie den Namen dieser Links in JavaScript ändern, werden diese Werte nicht an Sie zurückgeschrieben.
Unter Sumbit werden nur Formularelemente zurück an den Server gesendet (<input> s, zum Beispiel), nicht <a> Elemente, so dass Ihr Server nicht weiß, dass die Änderungen vorgenommen wurden.

Zweitens, auch wenn Sie die <a> s <input> s ändern werden, haben Sie immer noch ein Problem: Sie werden diese Werte zu finden in reportTable.Rows[0].Cells wie erwartet nicht in der Lage sein. Normalerweise wird asp.net diese Werte auch für dynamisch erzeugte Steuerelemente korrekt ausfüllen, aber nicht hier - da Sie ihre Namen geändert haben! Asp.net kann diese Werte nicht erneut binden.

Also, was sollten Sie tun? Eine Option besteht darin, jeder Zelle ein verstecktes Feld hinzuzufügen.
Auf AddLinkButtonToRow, fügen Sie die folgenden Schritte aus:

HtmlInputHidden hidden = new HtmlInputHidden(); 
hidden.ID = "hidden" + linkButton.ID; 
hidden.Name = hidden.ID; //so it will be posted! 
hidden.Style["display"] = "none"; //better to have a CssClass 

Mit jQuery, die Sie scheinen zu wissen, die dieser Eingabefelder Werte ändern, nicht ihre Namen (so etwas wie $(editingID).parent().find(":hidden")).

Als nächstes sehen Sie möglicherweise nicht die Werte auf den Steuerelementen, aber Sie können sie unter Request.Form["hiddenh1"] finden ... Request.Form["hiddenh11"] - Alle Eingabefelder Namen werden veröffentlicht werden, und Sie kennen ihre Namen dieses Mal.

0

Ich bin nicht sicher, wo oder was „ReportTable“ und es tablecells ist, aber ich bin Ihr Problem zu raten ist, dass Sie den Wert einiger Tags auf die Manipulation sind Client, der jQuery verwendet und erwartet, dass sie zurück auf den Server gesendet werden?

Dies wird nicht funktionieren. Die Seite wurde mit bekannten Werten Ihrer HyperLink-Steuerelemente in ViewState gerendert. Da Tags keine Eingabetypen sind, werden sie bei einem Postback keinen Wert an den Server zurückgeben, und ViewState initialisiert sie immer mit ihren ursprünglichen Werten neu. Jede Manipulation muss auf der Serverseite erfolgen.

Ich würde empfehlen zu tun, was ScottE vorschlägt und aktualisieren Sie Ihr Update mit Jquery Ajax.

Verwandte Themen