背景: ドキュメントがなく、元のプログラマーに相談できないレガシーな 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 プロセスはすべて正しく完了したように見えますが (エラーやページ クラッシュは発生しません)、テキスト ファイルの書き込みは停止し、データはまったく書き込まれません。
質問:
すべてのプレースホルダーを含める必要はないと確信しています (ここを読んで、それは基礎となるフレームワークの一部であり、asp は実際には、Perl や PHP システムと同じように、名前付き変数を表示するだけです。プレーンな HTML フォームで)、なぜそれが起こっているのか、データを処理/抽出するために他に何かする必要があるかどうかについてのポインタはありますか?
2 番目の変数を読み込もうとすると、1 つだけを読み込んだときに (いくつかの大きな値の場合) 機能しているにもかかわらず、すべてが死んでしまうのはなぜですか?
asp.net と C# に関する推奨書籍はありますか? Sitepoint の「C# と VB を使用して独自の asp.net 4 Web サイトを構築する」があります。
事前調査: これについて広範な検索を行いましたが、これまでに見た回答のほとんどは、asp.net を使用して外部サイトなどから送信されたデータを処理したり、投稿を直接使用するスクリプトによって処理したりする人々に関連しています。私が asp.net のチュートリアルについて調べたすべてのサイトは、Request.Form["variable_name"] を使用する必要があると言っているように見えるので、ここで何か他のことが起こっているようです。