代码之家  ›  专栏  ›  技术社区  ›  Albireo

当使用由多列组成的主键的中继器时,如何处理按钮单击

  •  0
  • Albireo  · 技术社区  · 14 年前

    当项目所基于的记录由跨越多个列的主键标识时,我需要有关如何处理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 但我必须警告您:自定义类和属性、方法名等都是意大利语。

    事先谢谢你,安德里亚。

    1 回复  |  直到 14 年前
        1
  •  1
  •   Graham Clark    14 年前

    您可以使用按钮的command事件和commandArgument属性,正如您所描述的那样,但是在升级对象上创建一个只读属性,该属性返回联合主键的某些串联。将此属性绑定到按钮的commandArgument。

    如果无法或不想创建只读属性,可以在代码隐藏中编写一个简单方法来构造串联,并从eval方法调用它,例如。

    <asp:Button ... 
         CommandArgument='<%# ConcatenatePrimaryKeys(Eval("complaint_id"), Eval("escalation_date")) %>'
         runat="server" />