我在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;”。因此代码不会被执行。 有没有一种以这种方式填充控制属性的好方法?
答案 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关键项目上取得成功的事情。 您可以将视图状态保存为会话,并创建会话密钥到视图状态。这样您就让服务器处理视图状态而不是客户端。它会产生额外的服务器负载,但总会有权衡。