当项目所基于的记录由跨越多个列的主键标识时,我需要有关如何处理ASP.NET中继器项目中的按钮单击的帮助。
背景:
我要说的那一页是
Complaint
它是一个具有某些属性的对象,来自数据库,并将其属性显示给用户。
其中一个属性是
Escalations
,这是一个
System.Collections.Generic.List<Escalation>
对象。
这个
Escalation
对象只是以下SQL表的代码内表示形式:
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])
)
显示
升级
我选择使用
System.Web.UI.WebControls.Repeater
,因为我需要一个复杂的布局,所以我使用了以下代码(它是实际代码的简化版本,以提高可读性,例如,“回复此投诉”部分放在模式弹出窗口中,有验证器等):
<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>
当用户单击
send_response
按钮,我需要更新相应的
升级
我不知道如何识别正确的那个。
protected void SendResponse(Object sender, EventArgs e)
{
// ?!?!
}
得到
complaint_id
不是大问题,我可以把它保存在
ViewState
因为每个人都一样
升级
.
如果
升级
我可以指定一个
CommandArgument
上
森德反应
但是,由于主键由
投诉人
和
escalation_date
列,这是不可能的。
我甚至发现了一些解决方案,包括将字段绑定到控件,例如
System.Web.UI.WebControls.Label
或
System.Web.UI.WebControls.Literal
但因为我要通过的领域是
DateTime
我不知道怎么处理。
问题:
可以识别-在
SendResponse
方法-正确
升级
?如果是,我怎么做?如果这不可行,如何更改显示数据的方式?
如果有人渴望阅读真实的资料来源,这里是
ASPX code
这里是
C# code
但我必须警告您:自定义类和属性、方法名等都是意大利语。
事先谢谢你,安德里亚。