2010-05-24 56 views
2

好的,我们今天在工作中遇到了一个问题。这是一个奇怪的,我从来没有想过要尝试。服务器控件中的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 %> 

正如你所看到的,证明了“<”符号是在ASP.NET实际处理页面之前进行编码。对我来说这似乎很奇怪,因为我认为即使它不是很漂亮,但它应该起作用。我很困惑。

更糟糕的是,客户坚持认为这是IE中的一个错误,因为它似乎可以在Firefox中使用。事实上,它也在Firefox中被打破,除了某些原因,Firefox将它视为0.

关于为什么发生这种情况以及如何轻松修复它的任何想法?我试图在服务器控件中呈现的所有内容都会越过。

编辑 好吧,我发现了一个“修复”

<form id="form1" runat="server" method="post" action='<%# String.Format("Default.aspx?id={0}", 5) %>' > 

但是,这需要我调用DataBind这是原来的黑客加入更多的黑客攻击的。猜猜如果没有人想到其他事情,我将不得不这样做。

+0

哇!你确定没有其他方法可以解决这个问题吗?你是否正在做一些跨页的回帖?很少看到为webform应用程序指定的“操作”。 – 2010-05-25 00:44:53

+0

它实际上发回自己。确实很奇怪!这是所有内嵌代码“后面”的Web表单。我同意,我从来没有在web表单中使用action属性。从来没有需要。 – John 2010-05-25 01:02:42

回答

0

表单需要runat=server

+0

正如在上面的例子中指出的那样,它的确有runat =“server” – John 2010-05-25 14:53:14

1

ASP.NET 3.5中添加了 “动作” 属性HtmlForm控件。你之前的代码工作得很好,因为“action”只是一个字符串,代码块会为你发出额外的数据。现在有一个Action属性,因为服务器端控件需要一个属性具有文字字符串值(与任何其他服务器端控件属性相同),所以不能使用简单的代码发出块。

使用绑定语法的解决方法是正确的。为了使它像以前一样工作,你必须删除表单上的runat = server标记,这样可以防止ASPX解析器将其视为HtmlForm控件,并将其视为文字(代码发出的位置金块将被允许工作)。

您的其他选项可能更简洁 - 只需在page_load中通过代码隐藏设置表单的操作属性即可。 Action属性的设置原因是因为在早期版本的.NET Framework中,不支持设置Action属性。

+0

,使用'form1.Action = string.Format(“default.aspx?id = {0}“,_id)'后面的代码更干净,你在问题标题中提到了内联,所以也许你有理由保持内联。 – MikeM 2011-03-02 22:32:30