如何在 ASP.NET 中獲得更多控制權?
我正在嘗試建構一個非常非常簡單的“微型網路應用程序”,如果我完成它,我懷疑一些 Stack Overflow 的人會對它感興趣。我將它託管在我的 C# in Depth 站點上,它是 vanilla ASP.NET 3.5(即不是 MVC)。
流程非常簡單:
- 如果使用者使用未指定所有參數的 URL 輸入應用程序(或者如果其中任何參數無效),我只想顯示使用者輸入控制項。(只有兩個。)
- 如果使用者使用包含所有必需參數的 URL 進入應用程序*,我想顯示結果和*輸入控制項(以便他們可以更改參數)
這是我自己提出的要求(設計和實現的混合):
- 我希望送出使用 GET 而不是 POST,主要是為了讓使用者可以輕鬆地為頁面添加書籤。
- 我不希望 URL 在送出後看起來很傻,上面有多餘的點點滴滴。請僅提供主 URL 和實際參數。
- 理想情況下,我想完全避免需要 JavaScript。在這個應用程序中沒有充分的理由。
- 我希望能夠在渲染期間訪問控制項並設置值等。特別是,如果 ASP.NET 無法自動執行此操作,我希望能夠將控制項的預設值設置為傳入的參數值對我來說(在其他限制範圍內)。
- 我很高興自己完成所有參數驗證,而且我不需要太多伺服器端事件的方式。在頁面載入時設置所有內容而不是將事件附加到按鈕等非常簡單。
大部分都可以,但我還沒有找到完全刪除視圖狀態並保留其餘有用功能的任何方法。使用這篇博文中的文章,我設法避免獲得視圖狀態的任何實際值- 但它仍然作為 URL 上的參數結束,這看起來真的很難看。
如果我將其設為純 HTML 表單而不是 ASP.NET 表單(即取出
runat="server"),那麼我不會得到任何神奇的視圖狀態 - 但是我無法以程式方式訪問控制項。我可以通過忽略大部分 ASP.NET 並使用 LINQ to XML 建構 XML 文件並實現
IHttpHandler. 不過感覺水平有點低。我意識到我的問題可以通過放鬆我的約束(例如使用 POST 並且不關心剩餘參數)或使用 ASP.NET MVC 來解決,但是我的要求真的不合理嗎?
也許 ASP.NET 並沒有縮小到這種應用程序?不過,有一個很可能的替代方案:我只是很愚蠢,而且有一種非常簡單的方法可以做到,我只是還沒有找到。
有什麼想法,有人嗎?(關於強者是如何倒下的提示評論等。這很好 - 我希望我從未聲稱自己是 ASP.NET 專家,因為事實恰恰相反……)
該解決方案將使您能夠以程式方式訪問整個控制項,包括控制項上的所有屬性。此外,送出時只有文本框值會出現在 URL 中,因此您的 GET 請求 URL 將更“有意義”
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="JonSkeetForm.aspx.cs" Inherits="JonSkeetForm" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title>Jon Skeet's Form Page</title> </head> <body> <form action="JonSkeetForm.aspx" method="get"> <div> <input type="text" ID="text1" runat="server" /> <input type="text" ID="text2" runat="server" /> <button type="submit">Submit</button> <asp:Repeater ID="Repeater1" runat="server"> <ItemTemplate> <div>Some text</div> </ItemTemplate> </asp:Repeater> </div> </form> </body> </html>然後在您的程式碼隱藏中,您可以在 PageLoad 上執行您需要的所有操作
public partial class JonSkeetForm : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { text1.Value = Request.QueryString[text1.ClientID]; text2.Value = Request.QueryString[text2.ClientID]; } }如果你不想要一個有 的表單
runat="server",那麼你應該使用 HTML 控制項。為您的目的使用它更容易。只需使用正常 HTML 標記並放置runat="server"並給它們一個 ID。然後,您可以以程式方式訪問它們並編寫不帶ViewState.唯一的缺點是您將無法訪問許多“有用”的 ASP.NET 伺服器控制項,例如
GridViews。我在範例中包含了 aRepeater,因為我假設您希望將欄位與結果放在同一頁面上,並且(據我所知) aRepeater是唯一一個runat="server"在 Form 標籤中沒有屬性的情況下執行的 DataBound 控制項。