J'ai besoin d'aide pour gérer les clics sur les boutons dans un élément de répéteur ASP.NET lorsque l'enregistrement sur lequel l'élément est basé est identifié par un point primaire clé couvrant plusieurs colonnes.Comment gérer les clics sur un bouton lorsque vous utilisez un répéteur avec une clé primaire formée de plusieurs colonnes
Les arrière-plans:
La page dont je parle va chercher un Complaint
, qui est un objet avec des propriétés, de la base de données et affiche ses propriétés à l'utilisateur. L'une de ces propriétés est Escalations
, qui est un objet System.Collections.Generic.List<Escalation>
.
L'objet Escalation
est simplement une représentation en code de la table SQL suivante:
create table [escalations]
(
[complaint_id] int not null,
[escalation_group_id] varchar (50) not null
[escalation_date] datetime not null,
[escalation_text] text not null,
[response_date] datetime null,
[response_text] text null,
constraint [pk_escalations] primary key ([complaint_id], [escalation_date]),
constraint [fk_complaints] foreign key ([complaint_id]) references [complaints].([complaint_id]),
constraint [fk_escalation_groups] foreign key ([escalation_group_id]) references [escalation_groups].([escalation_group_id])
)
Pour afficher la liste des Escalations
je choisis d'utiliser un System.Web.UI.WebControls.Repeater
, parce que je besoin d'une mise en page complexe, donc je suis avec le code suivant (c'est une version dépouillée du code réel pour améliorer la lisibilité, par exemple le « Répondre à cette plainte » pièce est placée dans une fenêtre pop-up modal, il y a des validateurs et ainsi de suite):
<h2>Complaint #<asp:literal id="complaint_id" runat="server" /></h2>
<asp:repeater id="escalations" runat="server">
<itemtemplate>
<h3>Escalation date</h3>
<p><%# DataBinder.Eval(Container.DataItem, "complaint_date", "{0:yyyy-MM-dd}") %></p>
<h3>Complaint text</h3>
<p><%# DataBinder.Eval(Container.DataItem, "complaint_text") %></p>
<asp:panel id="response_panel" visible='<%# DataBinder.Eval(Container.DataItem, "response_date") == null ? false : true %>' runat="server">
<h3>Response date</h3>
<p><%# DataBinder.Eval(Container.DataItem, "response_date", "{0:yyyy-MM-dd}") %></p>
<h3>Response text</h3>
<p><%# DataBinder.Eval(Container.DataItem, "response_text") %></p>
</asp:panel>
<asp:panel id="reply_panel" visible='<%# DataBinder.Eval(Container.DataItem, "response_date") == null ? true : false %>' runat="server">
<h3>Reply to this complaint</h3>
<p><asp:textbox id="complaint_response" textmode="multiline" runat="server" /></p>
<p><asp:button id="send_response" text="Send response" onclick="SendResponse" runat="server" /></p>
</asp:panel>
</itemtemplate>
</asp:repeater>
Lorsque le l'utilisateur clique sur le bouton send_response
, je dois mettre à jour le Escalation
correspondant, et je suis à la perte sur la façon d'identifier le bon.
protected void SendResponse(Object sender, EventArgs e)
{
// ?!?!
}
Obtenir le complaint_id
est pas un gros problème, je peux l'enregistrer dans le ViewState
car il est le même pour tous les Escalation
.
Si le Escalation
aurait été identifié par une clé primaire construite sur une seule colonne, je aurait pu préciser un CommandArgument
sur le bouton send_response
, cependant, puisque la clé primaire est formée par les colonnes complaint_id
et escalation_date
, il est impossible de fais le.
J'ai même trouvé autour des solutions impliquant la délimitation des champs à des contrôles comme System.Web.UI.WebControls.Label
ou System.Web.UI.WebControls.Literal
, mais comme le terrain, je dois passer un DateTime
, je ne sais pas comment le gérer.
La question (s):
Il est possible d'identifier - quand la méthode SendResponse
- la Escalation
correcte? Si oui, comment puis-je le faire? Si ce n'est pas viable, comment puis-je changer la façon dont j'affiche les données?
Si quelqu'un est désireux de lire les sources réelles, voici le ASPX code et voici le C# code, mais je dois vous avertir: les classes et propriétés personnalisées, les noms de méthodes et ainsi de suite sont en italien.
Merci d'avance, Andrea.
Eh bien, cela semble une solution parfaitement logique que j'ai complètement raté ... – Albireo