ASP.NET Web サイトで新しいタグを使用したいと考えてい<button>
ます。これにより、特に、CSS スタイルのテキストとボタン内のグラフィックの埋め込みが可能になります。asp:Button コントロールは としてレンダリングされます。<input type="button">
既存のコントロールを にレンダリングする方法はあります<button>
か?
私が読んだことから、ボタンが 内にある場合、値属性の代わりにボタンのマークアップを投稿する IE との非互換性があります<form>
が、ASP.NET では onclick イベントを使用してとにかく __doPostBack を起動するので、私はしません。これが問題になるとは思わない。
これを使用してはいけない理由はありますか? そうでない場合、asp:Button、またはそれに基づく新しいサーバー コントロールでどのようにサポートしますか? 回避できる場合は、独自のサーバー コントロールを記述しないことをお勧めします。
最初はこの<button runat="server">
ソリューションは機能していましたが、すぐに HtmlButton コントロールにない CommandName プロパティが必要な状況に遭遇しました。結局、Button から継承したコントロールを作成する必要がありそうです。
render メソッドをオーバーライドして、必要なものをレンダリングするにはどうすればよいですか?
アップデート
DanHerbert の返信により、これに対する解決策を再び見つけることに興味が湧いたので、もう少し時間をかけて取り組みました。
まず、TagName をオーバーロードするはるかに簡単な方法があります。
public ModernButton() : base(HtmlTextWriterTag.Button)
{
}
Dan のソリューションの問題点は、タグの innerhtml が value プロパティに配置され、ポストバック時に検証エラーが発生することです。関連する問題として、値のプロパティを正しくレンダリングしたとしても、IE の脳死状態の<button>
タグの実装では、値の代わりに innerhtml がポストされます。そのため、これを実装する場合は、値のプロパティを正しくレンダリングするために AddAttributesToRender メソッドをオーバーライドする必要があります。また、ポストバックを完全に台無しにしないように、IE に何らかの回避策を提供する必要もあります。
データバインドされたコントロールの CommandName/CommandArgument プロパティを利用したい場合、IE の問題は解決できない場合があります。うまくいけば、誰かがこれに対する回避策を提案できます。
私はレンダリングを進めました:
これは正しい値を持つ適切な html としてレンダリングされ<button>
ますが、ASP.Net PostBack システムでは機能しません。イベントを提供するために必要なものをいくつか書きましたが、起動Command
しません。
このボタンを通常の asp:Button と並べて調べると、必要な違い以外は同じように見えます。したがってCommand
、この場合、ASP.Net がイベントをどのように配線しているかはわかりません。
もう 1 つの問題は、入れ子になったサーバー コントロールがレンダリングされないことです (ParseChildren(false) 属性でわかるように)。レンダリング中にリテラル HTML テキストをコントロールに挿入するのは非常に簡単ですが、ネストされたサーバー コントロールのサポートをどのように許可しますか?