【问题标题】:Pass object as CommandArguement in a Repeater Link Button在中继器链接按钮中将对象作为 CommandArguement 传递
【发布时间】:2012-09-11 16:34:54
【问题描述】:

我有一个带有客户列表的中继器。针对每个客户都有一个删除链接按钮。作为链接按钮的一部分,我想将客户对象传递给命令参数,如下所示(其中 Container.DataItem 是客户对象):

<asp:LinkButton  ID="lnkDelete" 
   OnClientClick="return confirmDelete();"  
   OnClick="Customer_OnDelete"  
   CommandArgument="<%# Container.DataItem  %>"  
   CommandName="Delete" 
   runat="server"></asp:LinkButton>

当我这样做时:

    var button = (((LinkButton) sender));

    var customer=  button.CommandArgument;

button.CommandArguement 是一个字符串。我需要所有对象属性,因为我们使用的是 Nhibernate,所以需要设置所有内容,删除记录的 ID 是不够的。我在网上看到了有关将逗号分隔的值列表传递到命令参数中的示例,但希望避免这样做。这可能吗?

有什么想法吗? 谢谢

【问题讨论】:

  • 您不能只使用该字符串(我假设这是一个 ID?)并使用它来查询您的数据库以获取您需要的所有元素吗? getCustomerById(int id) 之类的东西?
  • @JaneDoe - 对。这就是在这些场景中通常所做的事情。特别是因为使用 ORM 时,上下文将不会出现,您可以点击“保存”。

标签: c# asp.net repeater linkbutton commandargument


【解决方案1】:

在我看来,这种情况下最好的方法是:

  • CommandArgument获取ID
  • 通过 ID 获取客户
  • 删除客户实体

使用Repeater 事件OnItemCommand。此事件包含RepeaterCommandEventArgs。您无法通过这种方式获取CommandArgument

protected void myRepeater_ItemCommand(object source, RepeaterCommandEventArgs e)
{
   int customerID= Convert.ToInt32(e.CommandArgument.ToString());
}

在您的asp:LinkButton 标签处使用:

CommandArgument='<%# DataBinder.Eval(Container.DataItem, "ID") %>'

【讨论】:

  • 看起来这是我必须这样做的方式,通过传递客户并将其用于我的删除。
  • int customerID= Convert.ToInt32(e.CommandArgument.ToString());这是代码中的一个严重限制...您应该始终使用 try.parse
【解决方案2】:

您在这里遇到的问题是您的转发器必须被翻译成 HTML。因此,您受限于元素属性中规范所允许的范围。

在服务器端CommandArgument 将始终是一个字符串,因此您无法按照自己的意愿进行编码。

现在...您可以实施一些技巧来解决这个问题,例如前面提到的 CSV,或者您可以使用 binary serializationBase64 encode 结果。 但是,这些都是糟糕的解决方案!

您需要重新思考您是如何做到这一点的。我保证有一个更简单的方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-24
    • 2013-06-27
    • 2016-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-23
    • 1970-01-01
    相关资源
    最近更新 更多