Dot-Net

如何在 ASP.NET 中獲得更多控制權?

  • January 10, 2009

我正在嘗試建構一個非常非常簡單的“微型網路應用程序”,如果我完成它,我懷疑一些 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。我在範例中包含了 a Repeater,因為我假設您希望將欄位與結果放在同一頁面上,並且(據我所知) aRepeater是唯一一個runat="server"在 Form 標籤中沒有屬性的情況下執行的 DataBound 控制項。

引用自:https://stackoverflow.com/questions/431296