Передача CommandArguement в LinkButton из переменной

Я видел много ресурсов на SO, которые говорят, что я могу использовать следующий синтаксис для передачи значения в CommandArguement `LinkButton'

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

<%}%>

Но когда я пишу это в моем файле ascx и нажимаю на ссылку, значение, переданное аргументу команды "<%=comment.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" />&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>

Вы можете видеть, что я пытаюсь показать ссылки редактирования и удаления, если пользователь вошел в систему и его идентификатор совпадает с пользователем, который прокомментировал, но он говорит мне, что я могу использовать Eval в элементах управления с привязкой к данным. Как бы я скрыл / показать, редактировать / удалять ссылки в рамках повторителя

2 ответа

Вы можете просто использовать codebehind, например, в Page_Load:

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

Возможно, лучшим подходом было бы использовать Comments-collection(который представляется списком или массивом пользовательского класса) как DataSource из Repeater(или другой контроль веб-данных). Затем вы можете добавить LinkButtons к Itemtemplate,

Затем вы можете использовать ItemCreated или же ItemDataBound события повторителя в codebehind или встроенные теги ASP.NET для привязки CommandArgument,

Например:

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

То, что вы делаете в настоящее время, не рекомендуется и очень подвержено ошибкам. Вы можете легко достичь этого с помощью управления повторителем 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, тогда используйте строго привязанные к типу элементы управления Data Bound, например:

<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"},
   };
}
Другие вопросы по тегам