好的,我们今天在工作中遇到了问题。这是一个奇怪的,我从来没有想过要尝试。
<form id="form1" runat="server" method="post" action="Default.aspx?id=<%= ID %>" >
好的,它非常难看,我自己也不会尝试过。它出现在几年前编写的一些代码中,但是在客户的托管代码的Web服务器上安装了大量更新后,本周末一直在工作。
实际结果如下:html:
<form name="form1" method="post" action="Default.aspx?id=<%= ID %>" id="form1">
网址最终如下:
http://localhost:6735/Default.aspx?id=<%= ID %>
如您所见,证明“&lt;”在ASP.NET实际处理页面之前编码符号。对我来说这似乎很奇怪,因为我认为即使它不是很漂亮,它应该有效。我很困惑。
更糟糕的是,客户端坚持认为这是IE中的一个错误,因为它似乎可以在Firefox中运行。事实上,它在Firefox中也被打破了,除了某些原因Firefox将其视为0。
关于为什么会发生这种情况以及如何轻松解决问题的任何想法?我尝试在服务器控件中呈现的所有内容最终都会被转义。
修改 好的,我发现了一个“修复”
<form id="form1" runat="server" method="post" action='<%# String.Format("Default.aspx?id={0}", 5) %>' >
但是这需要我调用DataBind,这会给原始黑客增加更多的黑客攻击。猜猜如果没有人想到别的什么我就不得不接受。
答案 0 :(得分:1)
ASP.NET 3.5将“Action”属性添加到HtmlForm控件。您以前的代码工作正常,因为“action”只是一个字符串,代码块会为您发出额外的数据。既然存在Action属性,则不能使用简单的代码emit nugget,因为服务器端控件要求属性具有文字字符串值(与任何其他服务器端控件属性相同)。
使用biding语法的解决方法是正确的。为了使它像以前一样工作,你必须删除表单上的runat = server标记,这将阻止ASPX解析器将其视为HtmlForm控件,而是将其视为文字(代码发出的位置) nugget将被允许工作)。
您的其他选项可能更清晰 - 只需在page_load中通过代码隐藏设置Form的action属性。动作属性设置方式的原因是因为在早期版本的.NET Framework中,不支持设置Action属性。
答案 1 :(得分:0)
您的表单需要runat=server