2016-09-02 10 views
-1

タグ間にtextとhtmlを使用する目的で作成されたカスタムボタンに問題があります。 OnClientClickイベント以外はすべて正常に動作します。asp.netカスタムボタンOnClientClickが動作しない

ここには、独自のプロジェクトのButtonクラスがあります。

[ParseChildren(false)] 
[PersistChildren(true)] 
public class BButton : Button 
{ 
    protected override string TagName 
    { 
     get { return "button"; } 
    } 
    protected override HtmlTextWriterTag TagKey 
    { 
     get { return HtmlTextWriterTag.Button; } 
    } 
    public new string Text 
    { 
     get { return ViewState["NewText"] as string; } 
     set { ViewState["NewText"] = HttpUtility.HtmlDecode(value); } 
    } 
    protected override void OnPreRender(System.EventArgs e) 
    { 
     base.OnPreRender(e); 

     LiteralControl lc = new LiteralControl(this.Text); 
     Controls.Add(lc); 
     base.Text = UniqueID; 
    } 
    [Browsable(true)] 
    [EditorBrowsable(EditorBrowsableState.Always)] 
    [DisplayName("GlyphIcon")] 
    public string GlyphIcon 
    { 
     get { return this.ViewState["GlyphIcon"] as string; } 
     set { this.ViewState["GlyphIcon"] = HttpUtility.HtmlDecode(value); } 
    } 
    [Browsable(true)] 
    [EditorBrowsable(EditorBrowsableState.Always)] 
    [DisplayName("FontAwsome")] 
    public string FontAwsome 
    { 
     get { return this.ViewState["FontAwsome"] as string; } 
     set { this.ViewState["FontAwsome"] = HttpUtility.HtmlDecode(value); } 
    } 
    protected override void RenderContents(HtmlTextWriter writer) 
    { 
     if (!string.IsNullOrEmpty(this.GlyphIcon)) 
     { 
      writer.AddAttribute(HtmlTextWriterAttribute.Class, "glyphicon " + this.GlyphIcon); 
      writer.AddStyleAttribute(HtmlTextWriterStyle.MarginRight, "5px"); 
      writer.RenderBeginTag(HtmlTextWriterTag.Span); 
      writer.RenderEndTag(); // </span> 
     } 
     if (!string.IsNullOrEmpty(this.FontAwsome)) 
     { 
      writer.AddAttribute(HtmlTextWriterAttribute.Class, "fa fa " + this.FontAwsome); 
      writer.AddStyleAttribute(HtmlTextWriterStyle.MarginRight, "5px"); 
      writer.RenderBeginTag(HtmlTextWriterTag.Span); 
      writer.RenderEndTag(); // </span> 
     } 
     RenderChildren(writer); 
    } 
} 

これは動作するaspページ呼び出しです。

<CPCC:BButton ID="btnDelete" CssClass="btn btn-danger" runat="server" CausesValidation="False" OnClick="btnDelete_Click" OnClientClick="return confirm('Are you sure you want to Delete this item?');"><i class="fa fa-trash-o">&nbsp;</i>&nbsp;<asp:Localize runat="server" meta:resourcekey="btnDeleteText" /> 
</CPCC:StyleButton> 

この呼び出しは動作しません。

<CPCC:BButton id="btnAdd" CssClass="btn btn-success" runat="server" OnClick="btnAdd_Click" ValidationGroup="Create" OnClientClick="ShowProgressDialog('Creating Account...');"> <i class="fa fa-plus">&nbsp;</i>&nbsp;<asp:Localize runat="server" meta:resourcekey="btnCreateText"/> </CPCC:StyleButton> 

すべては検証が必要ボタンのOnClientClick="return confirm('Creating Account...');"を除いて動作し、これはASPで正しく動作します:ボタンを。ここに何かがないのですか?

+0

を試すことができ、その場合にはクリックに応答するために、子コントロール(リテラル)が必要ですが、あなたはJavaScriptを使用して試すことができます - http://stackoverflow.com/questions/16293456/onclientclick-does-not-works-on-asp-net-linkbutton – MethodMan

答えて

0

BButtonには、ASP:ButtonコントロールのRenderContentsメソッドがオーバーライドされているため、(通常はJavascriptをレンダリングする)基本メソッドはスキップされます。

RenderContentsメソッドに、OnClientClickプロパティを読み取り、適切なマークアップを出力するコードを追加する必要があります。

もしあなたが非常に賢いのであれば、base.RenderContents()に電話してやることができます。

それともあなたはちょうどあなたが

protected override void OnPreRender(System.EventArgs e) 
{ 
    base.OnPreRender(e); 

    LiteralControl lc = new LiteralControl(this.Text); 
    lc.Attributes.Add("onclick",this.OnClientClick); 
    Controls.Add(lc); 
    base.Text = UniqueID; 
} 
+0

これをさらに追跡すると、CausesValidation = "False"の取り消しボタンでは機能しますが、検証が必要な場合は機能しません。私は変更を反映するために私の投稿を今編集しています。 –

関連する問題