1

ASP.NET アプリケーションを書き直していて、動作の違いに気付きました...

私の Page_Load イベントには、次のようなコードがあります。

string id = Request["id"]

URL から id パラメータを取得します。ページの読み込み時 (HTTP GET など)、これは両方のバージョンで期待どおりに機能します。ボタンの onclick イベント ハンドラーもあります。明らかに、これはサーバーへの POST を実行し、Page_Load ハンドラーも呼び出します。違いは、アプリの元のバージョンでは、id が要求から正常に読み込まれることです。アプリの新しいバージョンでは、id は null として返されます。代わりに Request.Params["id"] を使用する必要があることを発見しましたが、Request["id"] が一方のアプリでは POST リクエストに対して機能するのに、もう一方のアプリでは機能しない理由について完全に困惑しています。

アプリの唯一の違いは、最初のアプリは [ファイル] -> [新しい Web サイト] として作成され、2 つ目のアプリは [ファイル] -> [新しい Web アプリケーション] として作成されたことです。これが動作の違いの原因だと思いますが、なぜこの微妙な違いなのか、また2つの間に他に注意すべき点があるのか​​ 疑問に思っています.

アドバイスをいただければ幸いです。

4

2 に答える 2

0

私はいつも Web アプリケーション プロジェクトを使用しますが、違いはコンパイルです。Web サイトには動的なコンパイルがあります。つまり、最初の要求は遅くなり、Web アプリにはコンパイル済みのリリース DLL があります。

長所と短所については、これを確認してください: http://maordavid.blogspot.ca/2007/06/aspnet-20-web-site-vs-web-application.html

于 2012-04-18T23:01:04.377 に答える
0

あなたが言及したように、あなたは id パラメータを2回通しています。これは、クエリ文字列パラメーターに 1 つとフォーム パラメーターに 1 つあるためです。これが 1 つの Web アプリで発生し、他の Web アプリでは発生しない理由はわかりませんが、コードを変更して、より正確な方法でそれを考慮することができます。

ブラウザーで HTML のソースを表示するとaction、フォームの値がクエリ文字列を含む現在のページの URL であることがわかります。これが、最初の ID が送信される理由です。明らかに、2 番目の ID はフォーム自体を介して取得されます。

基本的な Web フォームの HTML ソース

<form method="post" action="Default.aspx?id=3" id="ctl01">
    <input type="text" name="id">
</div>

ここでできることはいくつかあります。

  1. まず、これにはRequest.Params ["id"] を使用しません。これは、クエリ文字列、フォーム、Cookie、およびサーバー変数を 1 つのコレクションに結合するためです。必要なものとタイミングに基づいて、Request.QuerystringおよびRequest.Formプロパティを使用する必要があります。
  2. Page_Load ハンドラーで、Page.IsPostBackプロパティを使用して、ページが GET または POST のどちらで読み込まれているかを判断し、上記の Request プロパティを使用します。

Page.IsPostBack の使用例:

protected void Page_Load(object sender, EventArgs e)
{
    string id = string.Empty;
    if (Page.IsPostBack)
    {
        id = Request.Form["id"];
    }
    else
    {
        id = Request.QueryString["id"];
    }
}
于 2012-04-19T00:23:59.873 に答える