208

runat="server"ASP.NET コントロールが必須の属性であり、ASP.NET に関する限られた知識の中で使用できる唯一のオプションであるのに、なぜすべての ASP.NET コントロールで指定する必要serverがあり、使用しないとエラーが発生するのですか?

オプションで HTML タグに使用できることは理解していますし、クライアント/サーバー パラダイムとそれが実際に何を指定しているのかを理解しています。

ASP.NET コントロールであるコントロールによって暗示される可能性のある冗長なタグですか、それとも根本的な理由がありますか?

4

14 に答える 14

113

私は常に、ASP.NET タグと HTML タグを混在させることができ、HTML タグには存在するかどうかのオプションがあることを理解するために、それ以上のものがあると信じてきましたrunat="server"。タグをそのままにしても害はなく、削除するとコンパイラ エラーが発生します。Web 言語について暗示する内容が多ければ多いほど、初心者のプログラマーが Web 言語を習得するのは容易ではなくなります。これは、タグ属性について詳しく説明するのと同じくらい良い理由です。

この会話は、Mike Schinkel のブログで、彼自身と Microsoft National Services の Talbot Crowell の間で行われました。関連情報は以下のとおりです (ソースの文法上の誤りにより、最初の段落は言い換えられています)。

[...]しかし、の重要性<runat="server">は、一貫性と拡張性の方が重要です。

開発者が<asp: />、ASP.NET エンジンが無視するタグ (つまり ) をマークする必要がある場合、タグ間の名前空間の衝突や将来の機能強化の問題が発生する可能性もあります。属性を要求する<runat="server">ことで、これは無効になります。

それは続く:

<runat=client>すべてのクライアント側タグに必要な場合、パーサーはすべてのタグを解析してその<runat=client>部分を取り除く必要があります。

彼は続けます:

現在、私の推測が正しければ、パーサーは属性を持つタグ runat=serverまたは「<code><%」プレフィックスまたは ssi「<code><!– #include… (...) また、ASP.NET は Web デザイナー (foo.aspx) を Web 開発者 (foo.aspx.vb) から分離できるように設計されているため、Web デザイナーは独自の Web デザイナー ツールを使用して HTML を配置できます。 ASP.NET 固有のタグや属性について知らなくても、クライアント側の JavaScript を使用できます。

于 2008-11-20T04:14:21.990 に答える
33

私は通常、推測するのが好きではありませんが、これについては...

当時 (2001 年?) の Microsoft の .NET マーケティングの誇大宣伝を覚えていれば、.NET が何であるかさえ見分けるのは困難でした。サーバーでしたか。プログラミングプラットフォーム?言語?まったく新しいもの?広告を考えると、それはあいまいにあなたが望んでいたものでした-それはあなたが抱えているかもしれない問題を解決しただけです.

つまり、.NET ランタイムに関連付けられた Internet Explorer のコピーで、サーバー側またはクライアント側のどこでも ASP.NET コードを実行できるという壮大なビジョンが隠されていたのではないかと思います。runat="server" は単なる痕跡であり、クライアント側の同等物が本番環境に到達しなかったために取り残されました。

あの奇妙な広告を覚えていますか?

関連: The Register の記事と .NET の歴史。

于 2008-11-20T04:21:39.730 に答える
13

ページに含めることができるすべてのコントロールをサーバーで実行する必要があるわけではありません。例えば:

<INPUT type="submit" runat=server />

これは基本的に次のものと同じです。

<asp:Button runat=server />

最初のタグから runat=server タグを削除すると、ブラウザーで実行される標準の HTML ボタンが作成されます。サーバーで特定のコントロールを実行する理由と実行しない理由があり、含める HTML マークアップに基づいて ASP.NET が必要なものを "想定" する方法はありません。コントロールのファミリの runat=server を「推測」することは可能かもしれませんが<asp:XXX />、Microsoft はそれをマークアップ構文と ASP.NET エンジンへのハックと見なすだろうと思います。

于 2008-11-20T04:14:02.553 に答える
9

Microsoft Msdn の記事The Forgotten Controls: HTML Server Controlsでは、runat="server" の使用について、テキスト ボックスの例で説明しています<input type="text"><input type="text" id="Textbox1" runat="server">

これを行うと、Web ページが作成されてクライアントに送信される前に、サーバー上の HTML 要素にプログラムでアクセスできるようになります。HTML 要素には id 属性が含まれている必要があります。この属性は要素の ID として機能し、特定の ID によって要素をプログラムできるようにします。この属性に加えて、HTML 要素には runat="server" が含まれている必要があります。これは、タグがサーバー上で処理され、従来の HTML 要素と見なされないことを処理サーバーに伝えます。

つまり、HTML 要素へのプログラムによるアクセスを有効にするには、それに追加runat="server"します。

于 2016-04-05T05:54:12.683 に答える
3

私の疑惑は、処理中にサーバー側のコントロールがどのように識別されるかに関係しているということです。実行時にすべてのコントロールを名前でチェックして、サーバー側の処理が必要かどうかを判断するのではなく、タグによって内部ノード表現を選択します。コンパイラは、サーバー タグを必要とするすべてのコントロールに、検証ステップでタグが含まれていることを確認します。

于 2008-11-20T04:16:04.920 に答える
2

ASP.NET ファイルの HTML 要素は、既定ではテキストとして扱われます。これらの要素をプログラム可能にするには、runat="server"属性を HTML 要素に追加します。この属性は、要素をサーバー コントロールとして扱う必要があることを示します。

于 2015-04-02T07:34:12.287 に答える
1

通常のhtmlタグで使用すると、イベントハンドラーなどでプログラムで操作できることを意味します。たとえば、ページの読み込み時にアンカータグのhrefまたはクラスを変更します...必要な場合にのみ実行してください.バニラhtmlタグ速く進みます。

ユーザー コントロールとサーバー コントロールに関する限り、いいえ、aspx プリプロセッサの内部を掘り下げることなく、それらなしでは機能しません。その理由を正確に言うことはできませんでしたが、おそらく正当な理由で、パーサーはそのように、「何かをする」と明示的にマークされたものを探します。

@JonSkeet がどこかにいる場合、彼はおそらくより良い答えを提供できるでしょう。

于 2008-11-20T04:17:43.000 に答える
1

Microsoft は、ページがコンパイルされる前にコンパイラに runat 属性を追加させることで、このあいまいさを修正できると思います。これは、Java がジェネリックスで持っている型消去のようなもので、消去する代わりに、runat=server をどこにでも書き込むことができます。 asp: タグのプレフィックスなので、開発者はそれについて心配する必要はありません。

于 2011-11-19T23:37:51.173 に答える
1

これは、ASP .NET のすべてのコントロールが「runat」属性を持つ System.Web.UI.Control から継承されているためです。

クラス System.Web.UI.HTMLControl では属性は必要ありませんが、クラス System.Web.UI.WebControl では属性が必要です。

編集: より具体的にさせてください。asp.net はほとんど HTML の抽象化であるため、特定のタグをサーバー側で実行する必要があることをコンパイラが認識できるように、コンパイラには何らかのディレクティブが必要です。その属性が存在しない場合、最初にサーバーで処理することを認識できません。そこにない場合は、通常のマークアップであると想定してクライアントに渡します。

于 2008-12-22T19:30:22.313 に答える
0

データを ASP.NET Web サーバーに送信すると、Runat = "server" として記述されたコントロールは、サーバー アプリケーションで Dot Net オブジェクトとして表されます。HTML コントロールにコードを手動で入力するか、デザイン ビューで右クリックして [サーバーとして実行]オプションを使用できます。ASP.NET コントロールは、ツールボックスからドラッグすると、通常は HTML コントロールが取得しないこの属性を自動的に取得します。

于 2013-01-27T18:16:07.513 に答える