【问题标题】:Passing CommandArguement to LinkButton from variable将 CommandArguement 从变量传递给 LinkBut​​ton
【发布时间】:2016-01-08 10:22:01
【问题描述】:

我在 SO 上看到很多资源说我可以使用以下语法将值传递给 `LinkBut​​ton' 的 CommandArguement

<%forearch(var comment in Comments){%>
<asp:LinkButton ID="del" CommandArguement='<%= comment.CommentId%>' onCommand="delete_click" Text="Delete"/>

<%}%>

但是当我在我的 ascx 文件中写入并单击链接时,传递给命令参数的值是 "&lt;%=comment.CommentId%&gt;" 而不是 commentId 本身。请指导我做错了什么?

编辑 1
基于答案和 cmets,我已经开始使用转发器而不是 foreach 和纯代码。这是我想出的代码

<asp:Repeater ID="commRepeater" SelectMethod="GetPageComments" runat="server">
        <ItemTemplate>
            <p>
                <%#Eval("Comment") %> 
                <%if(Page.User.Identity.IsAuthenticated && Page.User.Identity.GetUserId() == Eval("UserId")){ %>
                <span>
                    <asp:LinkButton  Text="Edit" runat="server" ID="EditLink" CommandArgument='<%#Eval("CommentId")%>' OnClick="Update_Comment" />&nbsp;&nbsp;
                    <asp:LinkButton  Text="Delete" runat="server" ID="DeleteLink" CommandArgument='<%#Eval("CommentId")%>' OnClientClick="if (!confirm('Are you sure you want delete?')) return false;" OnCommand="Delete_Comment"  />
                </span>
                <%} %>

            </p>
        </ItemTemplate>        </asp:Repeater>

如果用户已登录并且他的 ID 与评论的用户匹配,您可以看到我正在尝试显示编辑和删除链接,但它告诉我可以在数据绑定控件中使用 Eval。我将如何在转发器中有条件地隐藏/显示编辑/删除链接

【问题讨论】:

  • 请注意,我在传递给命令参数时使用了带有'&lt;%=comment.CommentId%&gt;' 的单引号
  • 应该是CommandArgument BTW。

标签: asp.net webforms commandargument


【解决方案1】:

您可以简单地使用代码隐藏,例如在Page_Load

protected void Page_Load(Object sender, EventArgs e)
{
    if(!IsPostBack)
    {
        del.CommandArgument = comment.CommentId;
    }
}

也许更好的方法是使用Comments-collection(它似乎是自定义类的列表或数组)作为Repeater(或其他网络数据绑定控件)的DataSource。然后您可以将LinkButtons 添加到Itemtemplate

然后,您可以在代码隐藏或内联 ASP.NET 标记中使用转发器的 ItemCreatedItemDataBound 事件来绑定 CommandArgument

例如:

CommandArguement='<%# DataBinder.Eval( Container.DataItem, "CommentId" ) %>'

【讨论】:

  • 在循环中创建了多个 LinkBut​​tons 如何在后面的代码中为每个链接按钮设置命令参数?
  • @MuhammadAdeelZahid:那是 ASP.NET MVC 吗?
  • @MuhammadAdeelZahid: 但&lt;%forearch 不是有效的 ASP.NET 语法。那么,您是如何以及在何处实际创建这些控件的?您知道您还可以使用Comments 作为转发器的数据源并将LinkButtons 添加到ItemTemplate
  • 你能给我举一个带有IEnumerable plz的中继器的例子吗?
  • @MuhammadAdeelZahid:只需将Comments(似乎是自定义类的列表或数组)设置为转发器的DataSourceDataBind。然后,您可以在代码隐藏或内联 ASP.NET 标记中使用转发器的ItemCreatedItemDataBound 事件来绑定CommandArgument。例如:CommandArguement='&lt;%# DataBinder.Eval( Container.DataItem, "CommentId" ) %&gt;'
【解决方案2】:

不推荐您当前正在执行的操作,并且极易出错。您可以使用这样的 ASP.NET 中继器控件轻松实现此目的:-

<asp:Repeater ID="MyRepeater" runat="server">
   <ItemTemplate>
       <asp:LinkButton ID="del" CommandArguement='<%# Eval("CommentId") %>' 
                 OnCommand="del_Command" Text="Delete" runat="server" />
   </ItemTemplate>
</asp:Repeater>

在 Page_Load 中简单地绑定它:-

 if (!Page.IsPostBack)
 {
      MyRepeater.DataSource = CommentsRepository();
      MyRepeater.DataBind();
 }

或者,如果您有 ASP.NET 4.5,则使用强类型数据绑定控件,如下所示:-

<asp:Repeater ID="MyRepeater" runat="server" ItemType="MyNamespace.Comment" 
              SelectMethod="MyRepeater_GetData">
   <ItemTemplate>
       <asp:LinkButton ID="del" CommandArguement='<%# Item.CommentId %>'
                    OnCommand="del_Command" Text="Delete" runat="server" />
   </ItemTemplate>
</asp:Repeater>

你在代码后面的方法应该是这样的(仅用于演示):-

public IEnumerable<MyNamespace.Comment> MyRepeater_GetData()
{
   return new List<Comment>
   {
       new Comment { CommentId =1, Name= "foo"},
       new Comment { CommentId =2, Name= "bar"},
   };
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多