web-dev-qa-db-ja.com

ASP.Netユーザーコントロールのベストプラクティス、プログラム、またはマークアップ?

ASP.NET Webフォームを主な製品とする会社でインターンシップを始めたところです。これまでの私の関連経験は、JavaおよびフロントエンドWeb開発です。現在の仕事は、さまざまなユーザーがサイトの応答性とアクセス性を高めることです。

現在、私は各HTMLページがどのように生成されるかを理解するのに苦労しています。ユーザーコントロールはすべて、プログラムで.ascx.csファイルの背後にあるコードから生成され、.ascxファイル自体にはマークアップがありません。

これが標準的な方法かどうか疑問に思っていましたか?また、各パーツが生成するものをより明確に把握するために使用できるツールはありますか?

5
Emma

***編集済み

ASP.NETはAJAXとDOM操作の初期段階で作成された14年ほど前に作成されました。アイデアは、コントロールを作成し、フォームにドラッグアンドドロップすることでした。コントロールは、Webフォームの下のツリーの一部になります。

とにかく、当時、ASP.NETはプロジェクトの90%に対応でき、Webアプリの作成がかつてないほど簡単になりました。現在は2015年であり、物事は長年にわたって劇的に変化しました。つまり、AJAXは至る所にあります。

ASP.NETの問題の1つは、コントロールがページのコントロール階層のどこに適合するかに基づいて、各コントロールに一意のIDを生成することです。また、ページの暗号化されたViewState(すべてのコントロールの状態)を別のフォームフィールドに保存します。したがって、DOMを大幅に変更した場合、ページがビューステートを復元しようとすると、ページがビューステートがキャプチャされたときと同じ状態ではなくなるため、エラーになります。

たとえば、「somepage_control_othercontrol」の生成されたIDをasp.netページで使用して、ページ内にネストされているコントロールを見つけ、現在のビューステートを復元できます。手動で行う必要はありません。つまり、まとめると、当時のベストプラクティスは、ネストされたコントロールを再利用し、マークアップに<asp:TextBox />などのxml表現があることでした。

ASP.NETを使用するために設計された方法を使用する場合は、ネストされたユーザーコントロールとサーバーコントロールを使用し、DOMをあまり使いすぎないようにしてください。

JavaScriptを介して多くのDOM操作を行う場合は、投稿パラメーターを手動で変数にプルすることを気にしないでください。投稿後の最後の値でコントロールが自動的に再入力されるかどうかは気にせず、独自の入力コントロール名を決定します。その後、サーバーコントロールなしでストレートHTML aspxファイルを使用し、ページのViewStateをオフにできますが、ほとんどのページでは、フレームワークが通常行うよりも多くの作業を実行します。

***編集を終了

私は数年前からMVC以外のasp.net開発を行っていませんが、ユーザーコントロールがどのように生成されるかを理解するために知っている最善の方法は、ページ実行とコントロール実行ライフサイクルを理解することです。enter image description here そしてそれらをレンダリングするイベント。

https://msdn.Microsoft.com/en-us/library/ms178472.aspx を参照してください

https://msdn.Microsoft.com/en-us/library/aa719775(v = vs.71).aspx

https://msdn.Microsoft.com/en-us/library/ms178472(v = vs.85).aspx

http://www.codeproject.com/Articles/457647/Understanding-ASP-NET-Application-and-Page-Life-Cy

PreInitこのイベントでは、すべての動的コントロール、マスターページ、プロファイル、テーマを設定する必要があります。

Initこれは、Controlプロパティの初期値を設定するために使用されます。

InitCompleteこれは、カスタムViewStateデータを使用するために使用する必要があります。これは、ViewStateがロードされ、変更できる最初の場所です。

プリロードこれは、コントロールのプロパティを設定するために使用できます。

すべてのデータベース接続とデータバインディングをここでロードできます。このイベントが完了する前に、すべての検証が行われます。イベントが終了すると、すべてのコントロールのイベントが実行されてから、このリストの次のイベントが呼び出されます。

LoadCompleteこのイベントは、完全にロードする必要があるコントロールのアクティビティに使用できます。

PreRenderこれは、ページに表示される前にコントロールの視覚的プロパティを変更できる最後のページです。

PreRenderCompleteこれは、ページの準備が整い、視覚要素に変更を加えることができないときに呼び出されます。この時点ですべてのデータバインディングが行われます。

SaveStateCompleteビューステートが保存され、この時点以降、ViewStateの変更は保存されません。つまり、ViewStateは既にページに保存されています。

アンロードページの処理が完了しました。これが呼び出される最後のイベントです。

基本的に、ページ内の特定のタイプのタスクを実行してライフサイクルを制御できる場所を正確に把握する必要があります。これを理解したら、タスクに適切なイベントをサブスクライブし、イベントハンドラーで必要なコードを記述するだけです。

これは、すべてのスコープにわたって順番に発生するすべてのイベントの完全なリストです

ページProcessRequest

ページProcessRequestMain

ページ決定PostBackMode

アダプター決定PostBackMode

ページLoa​​dScrollPosition

ページOnPreInit

ページApplyMasterPage

PostBack ApplyMasterPageRecursive

InitRecursiveの制御

コントロールResolveAdapter

コントロールApplySkin

ページApplyControlSkin

ポストバックApplyControlSkin

ページOnInitComplete

PostBack LoadAllState

PostBack LoadPageStateFromPersistenceMedium

PagePersisterロード

コントロールLoadControlStateInternal

LoadControlStateの制御

アダプターLoadAdapterControlState

LoadViewStateRecursiveの制御

LoadViewStateの制御

アダプターLoadAdapterViewState

PostBack ProcessPostData

ページOnPreLoad

LoadRecursiveの制御

OnLoadの制御

アダプタOnLoad

PostBack ProcessPostData

PostBack RaiseChangeEvents

PostBack RaisePostBackEvents

ページOnLoadComplete

コントロールPreRenderRecursiveInternal

コントロールEnsureChildControls

コントロールResolveAdapter

コントロールCreateChildControls

アダプタCreateChildControls

OnPreRenderの制御

アダプターOnPreRender

コントロールSaveViewState

ページSavePageStateToPersistenceMedium

PagePersister保存

ページOnSaveStateComplete

コントロールRenderControl

コントロールRenderControlInternal

レンダリングの制御

アダプタBeginRender

アダプターレンダリング

アダプターEndRender

コントロールRenderChildren

5
Paul W

それはページから構築するためのかなり非標準的な方法のように見えますが、それが必ずしも悪いことを意味するわけではありません。このようにして、マークアップに縛られることなく完全に動的にすることができます。たとえば、流動性の高いCMSには利点があります。

それらがHTMLの意味で生成するものに関して、 この答え はあなたが求めているほとんどのコントロールをカバーしているようです。

  • パネル-Div
  • パネル-GroupingText = "###"はフィールドセット、凡例です
  • ラベル-スパン
  • ボタン-入力、タイプボタン
  • リンクボタン-JSポストバックスクリプトを含むHref
  • ハイパーリンク-標準HREF
  • 画像ボタン-入力、画像の入力
  • テキストボックス-デフォルトは入力、タイプはテキスト
  • テキストボックス-モード=パスワードは入力、パスワードを入力
  • Textbox-Mode = Multiline is Textarea
  • DropDownList-選択
  • リストボックス-選択
  • RadioButton-入力、GroupName付きのRadio
  • チェックボックス-入力、チェックボックス
  • リピーター/リストビュー-コンプレックス。
  • グリッドビュー-テーブル
  • テーブル-テーブル
  • ファイル-入力、タイプ=ファイル

これを正確に見つけるためのツールがあるかどうかはわかりませんが、疑わしい場合は、ページ内に表示されるソースコードをいつでも表示して、実際にどのように機能しているかを知ることができます。非常に単純なテストプロジェクトをセットアップして、出力を確認するだけです。

1
Zachary Dow