2016-04-17 12 views
2

Ich versuche, eine Seite "Benutzer auswählen" zu erstellen, die Benutzerdaten dynamisch aus einer Datenbank extrahiert und anschließend einen Link für jeden Benutzer in der Datenbank generiert . Wenn auf den Link geklickt wird, ruft er eine C# -Funktion auf, um einen Cookie zu erstellen und den Benutzer umzuleiten.Erstellen eines HTML-Ankers zum programmgesteuerten Ausführen einer C# -Funktion

Der Code zieht die Benutzer korrekt aus der Datenbank und generiert die Links, die Links funktionieren jedoch nicht. Hier ist der C# -Code, die die Links erzeugt:

String sqlStatement = "SELECT * FROM TUsers"; 
    SqlConnection conn = new SqlConnection(WebConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString); 
    SqlCommand comm = new SqlCommand(sqlStatement, conn); 
     conn.Open(); 
     SqlDataReader Reader = comm.ExecuteReader(); 
     while (Reader.Read()) 
     { 
       container.InnerHtml += "<a runat='server' href='#' onServerClick='UserButton_Click' > <div class='users'> <p>" + Reader["FirstName"] + " " + Reader["LastName"] + "</p> </div> </a>"; 
     } 
     Reader.Close(); 
     conn.Close(); 

Hier ist der HTML-Quellcode auf der generierten Seite:

<div id="container"><a runat='server' href='#' onServerClick='UserButton_Click' > <div class='users'> <p>User 1</p> </div> </a> 

Das Backend C# -Code für, wenn der Link angeklickt wird, ist irrelevant für diese Frage . Mit Breakpoints wird die Funktion, die aufgerufen werden soll, niemals aufgerufen.

Ich habe versucht mit HTML-Anker mit onServerClick, die bisher nicht die richtige Funktion ausgeführt, sowie versuchen, <asp:LinkButton> Elemente zu verwenden, aber von was ich sagen konnte, wurden sie nicht korrekt analysiert, weil über generiert container.InnerHtml.

+0

Generieren Sie die ganze Seite dynamisch oder füllen Sie ein 'container' div, das bereits vorhanden ist ts im Markup? – ConnorsFan

+0

@ConnorsFan Der einzige Teil, der dynamisch erstellt wird, sind die Benutzer innerhalb des Container-Div. Der Rest der Seite existiert bereits in HTML Markup. – user3530169

Antwort

4

Sie könnten eine Listview-Kontrolle zu bekommen verwenden, was Sie wollen:

<asp:ListView ID="lvUsers" runat="server"> 
    <ItemTemplate> 
     <div> 
      <asp:LinkButton ID="lnkUser" runat="server" OnClick="lnkUser_Click" Text='<%# Eval("FirstName") + " " + Eval("LastName") %>' /> 
     </div> 
    </ItemTemplate> 
</asp:ListView> 

Die Datenquelle des Listview wie folgt festgelegt werden:

using (SqlConnection conn = new SqlConnection(WebConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString)) 
using (SqlCommand comm = new SqlCommand("SELECT * FROM TUsers", conn)) 
{ 
    SqlDataAdapter dataAdapter = new SqlDataAdapter(comm); 
    DataSet ds = new DataSet(); 
    dataAdapter.Fill(ds, "Users"); 
    lvUsers.DataSource = ds.Tables[0]; 
    lvUsers.DataBind(); 
} 

Und die Event-Handler wären ähnlich zu Was Sie bereits haben:

protected void lnkUser_Click(object sender, EventArgs e) 
{ 
    // Process user data and redirect 
} 
+0

Großartig! Völlig anderer Ansatz zu dem, was ich versuchte, aber es funktioniert genau so, wie ich es möchte. Mir war nicht bewusst, dass eine solche Kontrolle in ASP .NET existiert. Danke für die Hilfe! – user3530169

Verwandte Themen