【问题标题】:ASP.NET Update Panel Not Working Inside Web User ControlASP.NET 更新面板在 Web 用户控件中不起作用
【发布时间】:2012-08-03 18:49:33
【问题描述】:

我创建了一个 html5 画布和 javascript 签名板,我想将其实现为一个带有更新面板的 Web 用户控件来处理按钮点击。出于某种原因,如果我将更新面板和签名板控件直接添加到 aspx 文件中,则自动回发事件会起作用,但是当我将相同的代码放入 Web 用户控件时,字段(画布、按钮、div 等)会出现,但自动回发不再有效。在这两种情况下,我都将脚本管理器放在更新面板上方。

这是我的 ascx 代码:

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="Signature_Pad.ascx.cs"     Inherits="Controls_Signature_Pad" %>

 <asp:UpdatePanel runat="server" ID="signatureUpdate"  updatemode="Conditional">
  <Triggers>
     <asp:AsyncPostBackTrigger controlid="signatureApprove" eventname="Click" />
     <asp:AsyncPostBackTrigger controlid="sigClear" eventname="Click" />
     <asp:AsyncPostBackTrigger controlid="sigCancel" eventname="Click" />
  </Triggers>
  <ContentTemplate>
        <fieldset id="SignatureFieldSet" runat="server" style=" border: 1 solid black;">
       <p><asp:Label ID="signatureTextLabel" AutoPostBack="true"  runat="server" Text=""></asp:Label></p>
        <div id="canvasDiv" style="height: 300px; border:0px solid #000000; ">
            <canvas id="canvasSignature"  style="border:1px solid #000000;"></canvas>
        </div>
        <div id="sigButtonDiv"  style=" border:0px solid #000000;">
            <br /><br />
            <asp:Button AutoPostBack="true" runat="server" OnClick="OnApprove" ID="signatureApprove" Text="Approve" />
            <asp:Button AutoPostBack="true" runat="server" OnClick="OnClear" ID="sigClear" Text="Clear" />
            <asp:Button AutoPostBack="true" runat="server" OnClick="OnCancel" ID="sigCancel" Text="Cancel" />
        </div> 
    </fieldset>
 </ContentTemplate>
</asp:UpdatePanel>

这是我的 ascx 代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class Controls_Signature_Pad : System.Web.UI.UserControl
{
private string signatureData;
private string signatureText;

public string SignatureData
{
    get { return signatureData; }
    set { signatureData = value; }
}
public string SignatureText
{
    get { return signatureText; }
    set { signatureText = value; }
}

public void OnApprove(object sender, EventArgs e)
{
    UtilityClass.showMessageBox("Approve Clicked", this);
    SignatureText = "Approved Clicked";
}
public void OnClear(object sender, EventArgs e)
{
    UtilityClass.showMessageBox("Clear Clicked", this);
    SignatureText = "Clear Clicked";
}
public void OnCancel(object sender, EventArgs e)
{
    UtilityClass.showMessageBox("Cancel Clicked", this);
    SignatureText = "Cancel Clicked";
}

public void Page_Load(object sender, EventArgs e)
{
    signatureTextLabel.Text = signatureText;
}
}

这是我的相关aspx:

...
<%@ Register TagPrefix="mjt" TagName="SignaturePad" Src="~/Controls/Signature_Pad.ascx" %>
<asp:Content ID="Content1" ContentPlaceHolderID="head" runat="Server">
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="Server">

<asp:ScriptManager ID="ScriptManager" runat="server" EnablePartialRendering="true" EnablePageMethods="true"></asp:ScriptManager>
 <mjt:SignaturePad ID="SignaturePad" runat="server" Visible="true" SignatureData="" SignatureText="Test Signature Test." />

...

【问题讨论】:

  • 试试看:不要将更新面板和脚本管理器添加到您的 Web 使用控件中。将这两个添加到您的页面,然后在页面中的更新面板中添加控件并检查它是否有效。在您的帖子中还提到您使用母版页还是简单页面?脚本管理器是否也出现在您的页面上。
  • 我发现了问题。它适用于控件中的更新面板,我只是对事件的工作方式有一个基本的误解。我没有在控件中定义事件,我只是希望内置的 onClick 事件为我完成所有工作。谢谢你的想法。
  • 好,不客气。发布您的答案,以便对其他用户有所帮助。

标签: c# asp.net web-user-controls updatepanel


【解决方案1】:

在后面的代码中添加事件处理程序解决了这个问题。这是我的代码:

该控件具有三个需要触发事件的按钮(Approve、Clear 和 Canceled)。

在 ascx.cs 中:

public event EventHandler Approved;
public event EventHandler Cleared;
public event EventHandler Canceled;

 protected void signatureApprove_clicked(object sender, EventArgs e)
{

    if(Approved != null)
    Approved(this, EventArgs.Empty);

}
protected void sigClear_clicked(object sender, EventArgs e)
{
        if (Cleared != null)
        Cleared(this, EventArgs.Empty);
}
protected void sigCancel_clicked(object sender, EventArgs e)
{
       if (Canceled != null)
       Canceled(this, EventArgs.Empty);
}

在 ascx 中:

 <asp:UpdatePanel runat="server" ID="signatureUpdate"  updatemode="Conditional">
  <Triggers>
     <asp:AsyncPostBackTrigger controlid="signatureApprove" eventname="Click" />
     <asp:AsyncPostBackTrigger controlid="sigClear" eventname="Click" />
     <asp:AsyncPostBackTrigger controlid="sigCancel" eventname="Click" />
  </Triggers>
     <ContentTemplate>
       <fieldset id="SignatureFieldSet" class="fieldSetStyle" >
        <p><asp:Label ID="signatureTextLabel" AutoPostBack="true"  runat="server" Text=""></asp:Label></p>
        <div id="canvasDiv" runat="server" >
            <canvas id="canvasSignature" class="canvasStyle"></canvas> 
        </div>
        <div id="sigButtonDiv">
        <br />
            <asp:Button  AutoPostBack="true" runat="server" OnClick="signatureApprove_clicked" ID="signatureApprove" Text="Approve" CssClass="buttonStyle" />
            <asp:Button  AutoPostBack="true" runat="server" OnClick="sigClear_clicked" ID="sigClear" Text="Clear" CssClass="buttonStyle"/>
            <asp:Button  AutoPostBack="true" runat="server" OnClick="sigCancel_clicked" ID="sigCancel" Text="Cancel" CssClass="buttonStyle"/>
        </div> 
      </fieldset>
    </ContentTemplate>
</asp:UpdatePanel>

在 aspx 中:

<mjt:SignaturePad OnApproved="Signature_Approved"   OnCanceled="Signature_Canceled" OnCleared="Signature_Cleared" ID="SignaturePad" runat="server"   />

在 aspx.cs 中:

protected void Signature_Approved(object sender, EventArgs e)
{
    //Do signature approved action
}
protected void Signature_Canceled(object sender, EventArgs e)
{
    //Do signature cancel action
}
protected void Signature_Cleared(object sender, EventArgs e)
{
   //Do signature cleared action
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-30
    • 2014-06-27
    • 1970-01-01
    相关资源
    最近更新 更多