UpdatePanel内のGridviewがDOMでレンダリングされない
-
03-07-2019 - |
質問
ASP net Ajaxツールキットを使用しており、 UpdatePanel
内に GridView
があります。すべて正常に動作します。
生成するテーブルに対して JQuery
を実行しようとしても、 GridView
(またはテーブル HTML
)返されるDOM内。これはすべてASPで生成された Javascript
で行われていると思いますか?
UpdatePanel
内にある GridView
でアクションを実行するにはどうすればよいですか
解決
ASP.NETは、特定の条件下でコントロールの名前を破壊します。生成されたソースを見て、生成時にASP.NETによって指定された名前でコントロールを参照していることを確認することができます。マークアップで付けた名前ではないでしょう。
他のヒント
コードビハインド、主張のためのPage_Loadでjavascriptを生成できる場合、GridView1.ClientIDなどをjavascriptに挿入できます。 (たとえばここではTextBoxを使用していますが、同じ概念に従います。)
protected void Page_Load(object sender, EventArgs e)
{
string js = "$(document).ready(function(){$(\"#" + this.TextBox1.ClientID + "\").text('hello world');});";
HtmlGenericControl script = new HtmlGenericControl("script");
script.Attributes.Add("type", "text/javascript");
script.InnerHtml = js;
Page.ClientScript.RegisterStartupScript(this.GetType(), "key", js, true);
}
これには3つの解決策があります。 Daveが示唆しているように、ClientIDを使用してサーバーからjavascriptを挿入する最初の方法は機能しますが、非常に高速で乱雑になります。私はしばらくこれをしましたが、サーバー側とクライアント側のそのような密結合は問題を引き起こします。
2番目は、cssクラスなど、エンティティを識別する別の方法を提供することです。これは最初のオプションよりも優れていますが、多くの無関係なクラス定義を残しておく必要があります。
私が好む解決策は、セレクタエンジンを持つjQueryのようなjavascriptフレームワークを使用することです。そうすれば、巧妙な選択とDOMトラバーサルを通じてUniqueIDガーベッジを回避できます。
myControlという名前のコントロールがあるとします。 ASP.Netはその前に巨大な名前空間を生成するため、レンダリング時にidの衝突は発生しません。しかし、myControlで終わるIDを持つすべてのオブジェクトを選択する$( '[id $ = myControl]')を実行すると、すべてのmyControlを選択できます。他のフレームワークでこれを行う類似の方法はおそらくありますが、例を挙げるほどそれらに精通していません。