ASP.NET WebフォームにRunat =“ Server”属性が必要なのはなぜですか?


205

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

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

コントロールがASP.NETコントロールであることを暗示するだけの冗長なタグですか、それとも根本的な理由がありますか?


2
私はこの質問に同意します。もう少し明確にするために、「asp:」(およびヘッダーで指定する他のタグ)は解析に十分ではありませんか?または、コントロールがINPUTに変換された後にrunatがヒットして、他のHTMLと区別がつかなくなっていますか?runatはまだサーバーコントロールの形式になっている間にヒットするだろうと思います...
異常終了

1
おそらく、接頭辞または名前ベースの一種の「デフォルト属性」構成オプションをに追加Web.configすると、適切な回避策になります。解析プロセス中に、必要に応じてデフォルトの属性をDOMに挿入できます。私はこのアイデアで遊ぶつもりです...
ダンLugg

回答:


112

ASP.NETタグとHTMLタグを混在させることができ、HTMLタグには存在するrunat="server"かしないかのオプションがあることを理解するために、それ以上のものが存在すると常に信じてきました。タグを残しておくことは何の問題もありません。また、コンパイラエラーが発生してタグが削除されます。Web言語について多くのことを暗示するほど、新進のプログラマーがその言語にアクセスして学習することは容易ではなくなります。これは、タグ属性について冗長であるのと同じ理由です。

この会話は、Mike Schinkelのブログで、彼とMicrosoft National ServicesのTalbot Crowellの間で行われました。関連情報を以下に示します(ソースの文法エラーのために最初の段落を言い換えます)。

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

開発者が<asp: />ASP.NETエンジンが無視するタグ(viz。)をマークする必要がある場合、タグ間の名前空間の衝突と将来の機能拡張の潜在的な問題もあります。<runat="server">属性を要求することにより、これは否定されます。

それは続く:

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

彼は続けます:

現在、私の推測が正しい場合、パーサーは、runat=server属性のタグまたは「<%」プレフィックスまたはssi“ <!– #include(...)以外のすべてのテキスト(タグまたはタグなし)を単に無視します また、ASP.NETが設計されているためWebデザイナ(foo.aspx)をWeb開発者(foo.aspx.vb)から分離できるようにするため、Webデザイナは独自のWebデザイナツールを使用して、ASP.NETを知らなくてもHTMLとクライアント側JavaScriptを配置できます。特定のタグまたは属性。


59
理由が何であれ、それがPITAであるため、安全にデフォルト値にできる場合は、すべての<asp:>タグに入力する必要があります。
belugabob 2008

33

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

Microsoftの.NETマーケティングの誇大宣伝(2001年?)を覚えているとしたら、.NETが何であるかさえわからないほどでした。サーバーでしたか?プログラミングプラットフォーム?言語?まったく新しい何か?広告を考えると、それはあなたがなりたいと思っているものは曖昧でした-それはあなたが抱えているかもしれないあらゆる問題を解決しただけです。

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

それらの奇妙な広告を覚えていますか?

関連:.NETの履歴を含むRegisterの記事


5
「奇妙な広告」のあるサイトへのリンクをたまたま持っていますか?
RandomWebGuy 2011

はい、私は奇妙な広告を覚えています。ため息
キャットフード2013

13

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

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

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

<asp:Button runat=server />

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


2
コントロールがサーバーで実行されている場合、JavaScriptを使用して要素を選択できないということですか?例:document.getElementsById( "tvns:treeview");
Ciaran Gallagher

3
要素は引き続きクライアントのDOMにあるため、javascript / jQueryを使用して要素を変更することも可能です。ただし、特に動的コントロールの場合は、サーバーでレンダリングされた要素を扱うのが難しい場合があります。
Dave Swersky 2013年

8

マイクロソフトMSDNの記事忘れましコントロール:HTMLサーバーコントロールは、テキストボックス上の例とにrunat =「サーバー」の使用を説明<input type="text">し、それを変換することにより、<input type="text" id="Textbox1" runat="server">

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

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


2
ASP.NETタグでrunat = "server"が必須である理由を尋ねる質問には対処しません。
nhahtdh 2017

3
@nhahtdhその答えは、「プログラムによるHTML要素へのアクセスを可能にすること」です。:)
開発者MariusŽilėnas2017

2
OPは、タグの意味とその意味を理解しています。問題は、言語設計の観点から質問です。サーバー側で実行するには、ASP.NETタグでさえrunat = "server"でマークする必要があるとデザイナーが判断する理由は何ですか。
nhahtdh

@nhahtdhあなたの答えは何ですか?
開発者MariusŽilėnas2017

2
答えはありませんが、上位の回答が質問に答えます(正解かどうか)。あなたの答えはそうではありません、そしてそれが私のコメントの理由です。
nhahtdh 2017

3

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


2

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


1

ASP .NETのすべてのコントロールは、「ru​​nat」属性を持つSystem.Web.UI.Controlを継承するため、そこにあります。

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

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


3
あなたの答えは、まさに再定式化された質問です。
Pablo Fernandez

2
私の答えは、runat属性が継承のために存在することを単に述べていました。はっきりしないことをお詫びします。
Russ Bradberry

3
スタックが少なすぎます。恐らく、そもそもなぜそこにあるのかという質問でした。とにかくありがとう
johnc 2008

2
ここでも、本当に質問に答えるが、私はあなたが言うしようとしているものを見ていない
JOHNC

1

Microsoftは、ページがコンパイルされる前にコンパイラーにrunat属性を追加することで、このあいまいさを修正できると思います。たとえば、Javaがジェネリックで使用している型消去のようなものです。 asp:タグの接頭辞。開発者はそれを気にする必要はありません。


1

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

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

@JonSkeetがどこにでもある場合、彼はおそらくはるかに優れた答えを提供できるでしょう。


0

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


0

「asp」タグは明らかにASP要素であることを考えるとかなり冗長な属性であり、サーバー側のアクセス可能な要素として識別するのに十分なはずです。

ただし、他の場所では、コードビハインドで使用される通常のタグを昇格させていました。


0

私は試行錯誤によってこの結論に達しました:サーバー側でランタイムに要素にアクセスするにはrunat = "server"が必要です。それらを削除し、再コンパイルして何が起こるかを監視します。


-5

runat="Server" サーバーへのポストバックがHTML "コントロール"で発生することを示します。

Webフォームはpostback常に使用して、サーバーにページコントロールイベントを処理するように通知します。

.NET MVCページは使用しないでくださいpostback(フォームを除く)"submit")。 クライアント側でページを管理するためにMVC依存しJQUERYます(したがってpostback、サーバーへの大量のメッセージの必要性をバイパスします)。

そう: .NET Webフォーム... "runat"ページマークアップで属性をたくさん使用します。

.NET MVC"runat"ページマークアップで属性を使用することはほとんどありません。

これがなぜrunat必要なのかを明確にするのに役立つことを願っています...


1
-1事実が不正確で、質問に回答しない。
クリスティアンディアコネスク2014
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.