ASP.NET内联代码在服务器控件中

时间:2010-05-24 23:43:55

标签: asp.net

好的,我们今天在工作中遇到了问题。这是一个奇怪的,我从来没有想过要尝试。

<form id="form1" runat="server" method="post" action="Default.aspx?id=<%= ID %>" >

好的,它非常难看,我自己也不会尝试过。它出现在几年前编写的一些代码中,但是在客户的托管代码的Web服务器上安装了大量更新后,本周末一直在工作。

实际结果如下:html:

<form name="form1" method="post" action="Default.aspx?id=&lt;%= 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,这会给原始黑客增加更多的黑客攻击。猜猜如果没有人想到别的什么我就不得不接受。

2 个答案:

答案 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