ASP.NET WebフォームにRunat =“ Server”が必要な理由属性?
-
08-07-2019 - |
質問
ASP.NETコントロールが必須の属性であり、 server
が唯一のオプションである場合、すべてのASP.NETコントロールで runat =" server"
を指定する必要があるのはなぜですかASP.NETの知識が限られているため、使用しないとエラーが発生します。
HTMLタグでオプションとして使用できることを理解しています。クライアント/サーバーのパラダイムと実際に指定していることを理解しています。
これは、ASP.NETコントロールであるコントロールによって暗示される可能性のある冗長タグですか、それとも根本的な理由がありますか?
解決
ASP.NETタグとHTMLタグを混在させることができ、HTMLタグには runat =" server"
またはありません。タグを残しても何も害はありません。また、コンパイラエラーが発生します。 Web言語についてあなたが暗示しているものが多ければ多いほど、新進のプログラマーが入ってきて学習するのは簡単ではありません。これは、タグ属性について冗長にする理由と同じです。
この会話は、Mike SchinkelのMicrosoft National ServicesのTalbot Crowellとブログで行われました。関連情報は以下のとおりです(最初の段落はソースの文法エラーのために言い換えられています):
[...] しかし、
< runat =" server">
の重要性は、一貫性と拡張性のためです。ASP.NETエンジンが無視するために開発者がいくつかのタグ(つまり、
< asp:/>
)をマークする必要がある場合、タグ間の名前空間衝突の潜在的な問題もあります。今後の機能強化。< runat =" server">
属性を要求することにより、これは無効になります。
継続:
すべてのクライアント側タグに
< runat = client>
が必要な場合、パーサーはすべてのタグを解析し、< runat = client>
一部。
続行:
現在、 私の推測が正しい場合、パーサー 単にすべてのテキストを無視します(タグまたはno タグ)のタグでない限り
runat = server
属性または「<%
」 プレフィックスまたはssi“<!– #include
…(...) また、ASP.NETは Webデザイナーの分離を許可する (foo.aspx)Web開発者から (foo.aspx.vb)、Webデザイナーは 独自のWebデザイナーツールを使用して HTMLとクライアントサイドJavaScriptを配置する ASP.NETを知らなくても 特定のタグまたは属性。
他のヒント
通常、推測するのは好きではありませんが、これについて説明します...
Microsoftの.NETマーケティングの誇大広告(2001年?)を思い出すと、.NETが何であるかを伝えるのは困難でした。サーバーでしたか?プログラミングプラットフォーム?言語?まったく新しい何か?広告を考えると、それはあなたがそれを望んでいたことは何でもあいまいでした-それはあなたが持つかもしれない問題を解決しただけです。
だから、ASP.NETコードはどこでも(.NETランタイムに関連付けられたInternet Explorerのコピーで)サーバー側またはクライアント側で実行できるという隠された壮大なビジョンがあったと思います。 runat =" server"これは単なる残骸であり、クライアント側の同等物が本番環境に到達しなかったために残されました。
これらの奇妙な広告を覚えていますか?
ページに含めることができるすべてのコントロールをサーバーで実行する必要はありません 。例:
< INPUT type =" submit" runat = server />
これは基本的に次と同じです:
< asp:Button runat = server />
runat = serverタグを最初のタグから削除すると、ブラウザーで実行される標準のHTMLボタンがあります。サーバーで特定のコントロールを実行する理由と反対する理由があり、ASP.NETが「想定」する方法はありません。含めるHTMLマークアップに基づいて必要なもの。 「推測」することが可能かもしれません。 < asp:XXX />
コントロールファミリのrunat = serverですが、Microsoftはマークアップ構文とASP.NETエンジンへのハックを検討するだろうと思います。
Microsoft Msdnの記事忘れられたコントロール:HTMLサーバーコントロールで使用方法を説明runat =" server"のテキストボックス< input type =" text">
の例を使用して、< input type =" text"に変換します。 id =" Textbox1" runat =" server">
これを行うと、上のHTML要素へのプログラムによるアクセスが可能になります Webページが作成されてクライアントに送信される前のサーバー。 HTML要素にはid属性が含まれている必要があります。この属性は 要素のアイデンティティとして、要素にプログラムできるようにします 特定のIDによって。この属性に加えて、HTML要素 runat =" server"を含める必要があります。これにより、処理サーバーに タグはサーバー上で処理され、 従来のHTML要素。
要するに、HTML要素へのプログラムによるアクセスを有効にするには、 runat =" server"
を追加します。
疑わしいのは、処理中にサーバー側のコントロールがどのように識別されるかに関することです。サーバー側の処理を実行する必要があるかどうかを判断するために、実行時にすべてのコントロールを名前で確認するのではなく、タグによる内部ノード表現で選択を行います。コンパイラは、検証ステップ中にサーバータグを必要とするすべてのコントロールにそれらが含まれていることを確認します。
ASP.NETファイルのHTML要素は、デフォルトでテキストとして扱われます。これらの要素をプログラム可能にするには、HTML要素に runat =" server"
属性を追加します。この属性は、要素をサーバーコントロールとして扱う必要があることを示します。
ASP .NETのすべてのコントロールがSystem.Web.UI.Controlを継承するため、これは" runat"を持つ属性。
クラスSystem.Web.UI.HTMLControlでは属性は必須ではありませんが、クラスSystem.Web.UI.WebControlでは属性は必須です。
編集: もっと具体的にさせてください。 asp.netはほとんどHTMLの抽象であるため、特定のタグをサーバー側で実行する必要があることを認識するために、コンパイラには何らかの種類のディレクティブが必要です。その属性がなかった場合、最初にサーバーでそれを処理することを知らないでしょう。存在しない場合は、通常のマークアップであると想定し、クライアントに渡します。
Microsoftは、ページがコンパイルされる前にコンパイラにrunat属性を追加させることでこの曖昧さを修正できると思います。タグのasp:プレフィックスが表示される場所であれば、開発者は心配する必要はありません。
通常のhtmlタグで使用する場合は、イベントハンドラーなどでプログラム的に操作できることを意味します。たとえば、ページの読み込み時にアンカータグのhrefまたはクラスを変更します。バニラのhtmlタグは高速になります。
ユーザーコントロールとサーバーコントロールに関しては、いいえ、それらはaspxプリプロセッサの内部を掘り下げることなく、それらなしでは機能しません。正確な理由を言うことはできませんでしたが、おそらく正当な理由で推測します、彼らは、「何かをする」と明示的にマークされたものを探して、そのようにパーサーを書いただけです。
@JonSkeetがどこにいても、おそらくもっと良い答えを提供できるでしょう。
ASP.NET Webサーバーにデータを送信する場合、Runat =“ server”と記載されているコントロールは、サーバーアプリケーションでDot Netオブジェクトとして表されます。 HTMLコントロールにコードを手動で入力するか、デザインビューで右クリックして[サーバーとして実行]オプションを使用できます。 通常はHTMLコントロールではないツールボックスからドラッグすると、ASP.NETコントロールは自動的にこの属性を取得します。
" asp"を考慮したかなり冗長な属性タグは明らかにASP要素であり、サーバー側のアクセス可能な要素として識別するのに十分なはずです。
ただし、コードビハインドで使用される通常のタグを上げるために使用されていました。
私は試行錯誤でこの結論に達しました。 runat =" server"サーバー側で実行時に要素にアクセスするために必要です。 それらを削除し、再コンパイルして何が起こるか見てください。
runat =" Server"
は、HTML" control。"に対してサーバーへのポストバックが発生することを示します。
Webフォームは常に postback
を使用して、ページコントロールイベントを処理するようにサーバーに通知します。
.NET
MVC
ページでは、 postback
を使用しないでください(フォーム" submit"
を除く)。 MVC
は、 JQUERY
を使用してクライアント側のページを管理します(したがって、サーバーへの postback
メッセージを大量に送信する必要はありません)。
そう:
.NET
Webフォーム...ページマークアップで" runat"
属性を多数使用します。
.NET
MVC
は、ページマークアップで" runat"
属性をほとんど使用しません。
これは、 runat
が必要な理由を明確にするのに役立ちます...