我在SO上看到很多资源说我可以使用以下语法将值传递给`LinkButton'
的CommandArguement<%forearch(var comment in Comments){%>
<asp:LinkButton ID="del" CommandArguement='<%= comment.CommentId%>' onCommand="delete_click" Text="Delete"/>
<%}%>
但是当我在我的ascx文件中写这个并单击链接时,传递给命令参数的值是"<%=comment.CommentId%>"
而不是commentId本身。请指导我做错了什么?
编辑1
根据答案和评论,我已经开始使用转发器而不是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" />
<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
,您可以看到我正在尝试显示编辑和删除链接。如何在转发器中有条件地隐藏/显示编辑/删除链接
答案 0 :(得分:0)
您可以简单地使用代码隐藏,例如Page_Load
:
protected void Page_Load(Object sender, EventArgs e)
{
if(!IsPostBack)
{
del.CommandArgument = comment.CommentId;
}
}
也许更好的方法是使用Comments
- 集合(似乎是自定义类的列表或数组)作为DataSource
(或其他网站的Repeater
- 数据控制)。然后,您可以将LinkButtons
添加到Itemtemplate
。
然后,您可以在代码隐藏或内联ASP.NET标记中使用转发器的ItemCreated
或ItemDataBound
个事件来绑定CommandArgument
。
例如:
CommandArguement='<%# DataBinder.Eval( Container.DataItem, "CommentId" ) %>'
答案 1 :(得分:0)
目前不建议你做什么,而且非常容易出错。您可以使用ASP.NET Repeater控件轻松实现此目的: -
<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>
你后面的代码中的方法应该是这样的(仅适用于Demo): -
public IEnumerable<MyNamespace.Comment> MyRepeater_GetData()
{
return new List<Comment>
{
new Comment { CommentId =1, Name= "foo"},
new Comment { CommentId =2, Name= "bar"},
};
}