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