6

背景: ドキュメントがなく、元のプログラマーに相談できないレガシーな asp.net アプリケーションの作業を依頼されました。私は主に Perl プログラマーであり、主に *nix システムを使用しているため、システムの実際のロジックに大きな問題はありませんが、その下にある「必要最低限​​の」ものに結び付いています。

概要: 既存の aspx フォームを拡張して機能を拡張しようとしています。フォームは電話番号を購入するためのシステムの一部です。現時点では、最初に呼び出されたフォームは、場所と電話の市外局番のリストを HTML ドロップダウン リストに表示し、ユーザーがいずれかを選択することを期待しています。値が選択され (または、JS が無効になっている場合は、選択されて選択ボタンがクリックされ)、フォームが送信されると、ポストバック モードのページは、クエリ文字列に設定されたさまざまな値を使用して、購入ページへの適切なリダイレクトを提供します。ユーザーが市外局番を入力するためのテキスト ボックスと [検索] ボタンを含む、同じフォームに 2 行目のコントロールを追加して、機能を拡張したいと考えています。ユーザーがこれを行うと、システムはその市外局番の DB 検索を行い、一致が見つかった場合は、そのエリアを販売しているページへの適切なリダイレクトを生成します。すべてのコードは C# です (そしてこれからも)。

問題: asp.net フォームからのフォーム変数の抽出に関する Stack Overflow で多くの有用な情報を見つけたので、Request.form["variable_name"] を使用して新しい変数を取得しようとしました。しかし、その価値観が通用しないことがすぐに明らかになりました。

フォームの新しい部分の aspx ページ コードは次のとおりです。

<tr>
    <td align='left'><b>STD code:</b></td>
    <td align='left'>
        <asp:TextBox id="STD_Code_Search"
             AutoPostBack="True"
             Columns="7"
             Text=""
             TextMode="SingleLine"
             Wrap="False"
             runat="server"/>
    </td>
        <td><asp:Button ID="Button2" runat="server" Text="Search" /></td>
</tr>

これらの変数を元に戻すことができると期待していました

Button2_Clicked = Request.Form["Button2"]
STD_Code_Search = Request.Form["STD_Code_Search"]

しかし、何も届きませんでした。より多くの検索に基づいて、フォームに入力されるすべての変数を表示する次のコードを見つけました。

    foreach(string key in Request.Form.Keys)
    {
        LOG.WriteLine(key + ": " + Request.Form[key] + "<br/>");
    }

LOG オブジェクトは、テキスト ファイルに送信される StreamWriter であり、正常に動作しているようです。

ただし、ファイル内のデータは次のようになります。

ctl00$ctl00$ctl00$ContentPlaceHolder1$Main$Range_Data$STD_Code_Search: 01952<br/>
ctl00$ctl00$ctl00$ContentPlaceHolder1$Main$Range_Data$Button2: Search<br/>

次に、次を使用してC#でデータを取得しようとしました

STD_Search = Request.Form["ctl00$ctl00$ctl00$ContentPlaceHolder1$Main$Range_Data$STD_Code_Search"];

これは実際に機能し、STD_Search を StreamWriter LOG に送信すると、入力した値がテキスト ファイルに表示されます。

ただし、次に 2 番目の値を読み取ろうとすると (この場合は Button2 の値を取得しようとしているため、元のボタンではなくそのボタンがクリックされた場合に特定の動作をトリガーできます)、次のコードを使用します。

STD_Search = Request.Form["ctl00$ctl00$ctl00$ContentPlaceHolder1$Main$Range_Data$STD_Code_Search"];
Button2_Clicked = Request.Form["ctl00$ctl00$ctl00$ContentPlaceHolder1$Main$Range_Data$Button2"];

その後、asp.net プロセスはすべて正しく完了したように見えますが (エラーやページ クラッシュは発生しません)、テキスト ファイルの書き込みは停止し、データはまったく書き込まれません。

質問:

  1. すべてのプレースホルダーを含める必要はないと確信しています (ここを読んで、それは基礎となるフレームワークの一部であり、asp は実際には、Perl や PHP システムと同じように、名前付き変数を表示するだけです。プレーンな HTML フォームで)、なぜそれが起こっているのか、データを処理/抽出するために他に何かする必要があるかどうかについてのポインタはありますか?

  2. 2 番目の変数を読み込もうとすると、1 つだけを読み込んだときに (いくつかの大きな値の場合) 機能しているにもかかわらず、すべてが死んでしまうのはなぜですか?

  3. asp.net と C# に関する推奨書籍はありますか? Sitepoint の「C# と VB を使用して独自の asp.net 4 Web サイトを構築する」があります。

事前調査: これについて広範な検索を行いましたが、これまでに見た回答のほとんどは、asp.net を使用して外部サイトなどから送信されたデータを処理したり、投稿を直接使用するスクリプトによって処理したりする人々に関連しています。私が asp.net のチュートリアルについて調べたすべてのサイトは、Request.Form["variable_name"] を使用する必要があると言っているように見えるので、ここで何か他のことが起こっているようです。

4

3 に答える 3

3

このすべてを行うには、分離コードを使用する必要があります。それはそれをより簡単にします。

string searchText = STD_Code_Search.Text;

ボタンがクリックされたかどうかを知るには、次のようにします。

<asp:Button ID="Button2" runat="server" Text="Search" OnClick="Button2_Click" />

そして加工してもらう

protected void Button2_Click(object sender, EventArgs e)
{
    //button2 was clicked
}

Asp.Net は、PHP や JSP とは異なり、イベント駆動型のフレームワークです。Asp.Net で良い本を選んで読んでください。あなたがしようとしていたことのほとんどは、Asp.Net によって処理されました。

于 2012-11-12T18:25:02.457 に答える
1

コレクションは、Request.Form「生の」POST 本文のコンテンツに直接アクセスする場合にのみ使用されます。ASP.NET WebForms は抽象化レイヤーを操作するため、通常はこのコレクションを使用する必要はありません。

代わりに、親コントロールによって送信された値にアクセスします。この場合、コントロールは "STD_Code_Search" として知られています (.NET の命名規則とスタイル規則に対する重大な違反ですが、余談になります)。Visual Studio のツールを使用していると仮定すると、*.aspx ファイルと同じ名前で、" " という名前のクラス フィールドを含むサフィックス "designer.cs" を持つ自動生成ファイルがありますprotected TextBox STD_Code_Search;。このフィールドにアクセスするだけです。このフィールドは、Initページ イベントの後にのみ入力されることに注意してください。

string search = STD_Code_Search.Text;
于 2012-11-12T18:26:48.193 に答える
0

どのように機能するか試しました

.cs ファイル内のフォーム コントロールごとに保護された変数が必要です。Visual Studio の新しいバージョンでは、(サーバー側のマークアップ タグを追加するときに) これが行われますが、基本的には、変数 .g の .cs ファイルにインテリセンスがない場合です。

STD_Code_Search

宣言されていない場合は、ページの上部で次のようにします。

protected TextBox STD_Code_Search;

今、あなたがポストバックするときは値を持つSTD_Code_Search.Text べきです

私が言ったように、それはそれがどのように機能するべきかです。

Request.Form を使用するやむを得ない理由がない限り、そこに行くべきではありませんが、クライアント側の「名前」属性に書かれていることを知っておく価値があります (したがって、その恐ろしいプレースホルダーのもの)。よりきれいなものに上書きできます(asp.netバージョンに基づくオプション)。

于 2012-11-12T18:25:30.820 に答える