2010-05-24 57 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