asp.net web-forms命令参数问题

时间:2009-04-02 07:09:51

标签: .net asp.net-mvc webforms controls

我在asp.net webforms中遇到了一个按钮控件的问题。

使用mvc之后,我开始在webforms中的aspx文件中使用foreach,而不是转发器,这主要是转发器创建的所有垃圾视图状态。

当你只是遍历html控件时它很有用。 但是我在按钮控制方面遇到了困难。

<% foreach (var r in Reports) { %>
    <asp:LinkButton OnClick="Click_DeleteResult" CommandArgument='<%= r.ResultId.ToString() %>' runat="server">Delete</asp:LinkButton>
<% } %>

在回发时,该按钮上的命令参数变为“&lt;%= r.ResultId.ToString()%&gt;”。因此代码不会被执行。 有没有一种以这种方式填充控制属性的好方法?

3 个答案:

答案 0 :(得分:0)

您是否尝试过DataBinding表达式

<%# r.ResultId %>

答案 1 :(得分:0)

这太丑了。使用ASP.NET(尤其是MVC)的第一个好处是将逻辑和表示分开。每次我必须查看aspx文件来执行代码时,我都会感到畏缩。

如果您不喜欢ViewState“垃圾”,那么只需为该控件关闭它!

<asp:Repeater ID="MyRepeater" runat="server" EnableViewState="false">

如果你坚持这个...虽然我已经看到过这样的情况,除非我删除了周围的引号,否则ASP.NET无法正确解析服务器标签。像这样:

CommandArgument=<%= r.ResultId.ToString() %>

可能不完全符合HTML,但ASP.NET并不关心。如果由于某种原因确实需要输出那些周围的引号,可以将它们放在服务器标签内而不是外部。这是违反直觉的,但有时你必须这样做。

答案 2 :(得分:-1)

如何通过代码添加它,这是一个快速而肮脏的例子,但我认为你明白了:

HtmlTable table = new HtmlTable();
foreach (var r in Reports)
{
    LinkButton lnkbtn = new LinkButton();
    lnkbtn.CommandArgument = r.ResultId;
    lnkbtn.Click += Click_DeleteResult;
    HtmlTableRow tr = new HtmlTableRow();
    HtmlTableCell tc_resultID = new HtmlTableCell();
    tc_caseNo.Controls.Add(lnkbtn);
    tr.Cells.Add(tc_resultID);
    table.Rows.Add(tr);
}
div_yourContainerDiv.Controls.Add(table);

我有时候更喜欢这个解决方案..取决于作业..但是,对于你当前的问题,可能有一个解决方案,不需要你把它带到后面的代码:)

如果您使用通用内容进行大量工作,那么可以采用一种非常好的方式来实现它,而不需要任何视图状态的垃圾代码,这会使SE的所有内容混乱。

作为替代,你可以做一些我在一些SEO关键项目上取得成功的事情。 您可以将视图状态保存为会话,并创建会话密钥到视图状态。这样您就让服务器处理视图状态而不是客户端。它会产生额外的服务器负载,但总会有权衡。