2016-08-15 10 views
0

実行時にHTML要素を動的に構築し、レンダリングした要素を文字列として返すWebサービスを呼び出すときに例外が発生します。AssociateControlIDを使用してダイナミックラベルWebControlをレンダリングすると例外が発生する

System.Web.HttpException:ラベルに関連付けられているID「txtCertificate」との制御を見つけることができません「lblCertificate」

次のエラーがRenderControl()メソッドの呼び出しで発生します。

StringWriter stringWriter = new StringWriter(); 
HtmlTextWriter writer = new HtmlTextWriter(stringWriter); 

// Create System.Web.UI.WebControls.Panel (container) 
Panel pnlFRow1 = new Panel(); 
pnlFRow1.CssClass = "f-row"; 

// Create System.Web.UI.WebControls.Textbox 
TextBox txtCertificate = new TextBox(); 
txtCertificate.ID = "txtCertificate"; 
txtCertificate.CssClass = "f-input f-input-full"; 

// Create System.Web.UI.WebControls.Label 
Label lblCertificate = new Label(); 
lblCertificate.ID = "lblCertificate"; 
lblCertificate.CssClass = "f-label f-label-full"; 
lblCertificate.AssociatedControlID = txtCertificate.ID; 
lblCertificate.Text = "Certificate:"; 
Panel pnlCertificate = new Panel(); 
pnlCertificate.CssClass = "f-label f-label-full"; 

// Binding child controls to parent controls 
pnlFRow1.Controls.Add(lblCertificate); 
pnlFRow1.Controls.Add(pnlCertificate); 
pnlCertificate.Controls.Add(txtCertificate); 

// Render control 
pnlContent.RenderControl(writer); 

// Return rendered HTML 
return writer.InnerWriter.ToString(); 

私はこれが注文事項が、しかしこれは、同じエラーが発生する問題があるかもしれないことを考えて行pnlCertificate.Controls.Add(txtCertificate);後行pnlFRow1.Controls.Add(lblCertificate);を置いてみました。

属性は、Label WebControlを実際の<label>要素としてレンダリングし、入力コントロールの前に表示する必要があります。

答えて

2

これを行う1つの方法は、Labelクラスを継承し、RenderBeginTagメソッドを好みのものに置き換えることです。ネストLabelクラスなら、それはローカルコンテキストに保持し、それはたとえば、アプリケーション

の残りの部分に漏れ出る停止する必要があります:

public partial class _Default : Page 
{ 
     public class Label : System.Web.UI.WebControls.Label { 
     public string For = null; 
     public override void RenderBeginTag(HtmlTextWriter writer) { 
      AddAttributeIfExists(writer, "ID", ID); 
      AddAttributeIfExists(writer, "For", For); 
      writer.RenderBeginTag("Label"); 
     } 
     private void AddAttributeIfExists(HtmlTextWriter writer, string name, string value) { 
      if (!string.IsNullOrWhiteSpace(value)) 
       writer.AddAttribute(name, value); 
     } 
    } 

    protected void Page_Load(object sender, EventArgs e) { 
     StringWriter stringWriter = new StringWriter(); 
     HtmlTextWriter writer = new HtmlTextWriter(stringWriter); 

     Panel test = new Panel() { ID = "PanelTest" }; 

     TextBox txtCertificate = new TextBox() { ID = "txtCertificate" }; 
     Label lblCertificate = new Label() { ID = "lblCertificate", Text = "Certificate", For = txtCertificate.ClientID }; 

     test.Controls.Add(lblCertificate); 
     test.Controls.Add(txtCertificate); 

     test.RenderControl(writer); 
     string teststring = writer.InnerWriter.ToString(); 
    } 
} 

注:代わりAssociatedControlIdを使用するのではなく、あなたができるようになりました同じことをするカスタムのForプロパティを使用してください。また、Labelクラスがページクラス内でどのようにネストされているので、他のページと干渉しないように注意してください。私たちはこの答えの最初のバージョンで発見されたとして、あなたはAssociatedControlIdなし.Attributes["for"]を使用しようと

残念ながら、、.NETは<span><Label>に変換されますので、上記の例では、この問題を回避すべきです。

+0

属性を追加するとの唯一の問題は – MPaul

+0

うーん、奇妙な 'Label' WebBrowserコントロールが' '

+0

ここでは何かをしていますが、唯一の問題は他のプロパティをレンダリングしないことです。例えば、あなたの例の 'ID'プロパティはレンダリングされません。 – MPaul

関連する問題