Панель обновления веб-формы не смогла вызвать видимость пользовательского элемента управления

#asp.net #webforms

Вопрос:

Этот скрипт работал нормально, пока я не добавил к нему 2 «Панели обновления». Теперь это не имеет смысла.

Является ли это проблемой asp:панели пользовательского элемента управления «AlertMessage», которая не работает с панелью обновления nest?

 // Alert Message
// [ HTML ]
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="AlertMessage.ascx.cs" Inherits="Foo.AlertMessage" %>

<asp:Panel ID="pnlAlert" runat="server">
    <div class="toast alert alert-danger" role="alert">
        <i class="fas fa-exclamation-triangle"></i>
        <asp:Label ID="alertText" runat="server" Text=" " CssClass="pr-2"></asp:Label>
    </div>
</asp:Panel>

// [ C# ]
namespace Foo
{
    [ParseChildren(true)]
    public partial class AlertMessage : UserControl
    {
        public string Message { get; set; }

        protected void Page_Load(object sender, EventArgs e)
        {
        }

        public void Show()
        {
            if (!string.IsNullOrWhiteSpace(Message))
            {
                pnlAlert.Visible = true;
                alertText.Text = Message;
            }
        }

        public void Hide()
        {
            pnlAlert.Visible = false;
        }
    }
}


// Web.Config
<?xml version="1.0" encoding="utf-8"?>
  <system.web>
     <pages maintainScrollPositionOnPostBack="true" validateRequest="false">
      <controls>
        <add tagPrefix="h" tagName="AlertMessage" src="~/AlertMessage.ascx" />
      </controls>
    </pages>
  </system.web>


// Site.Master
// [ HTML ]
<%@ Master Language="C#" AutoEventWireup="true" CodeBehind="Site.master.cs" Inherits="Foo.Site" %>

<!DOCTYPE html>
<html lang="en">
<head runat="server">
</head>
<body>
    <form runat="server" AutoCompleteType="Disabled" onsubmit="return true;">

        <asp:UpdatePanel runat="server" UpdateMode="Conditional">
            <ContentTemplate>

                <asp:ContentPlaceHolder ID="ContentPlaceHolder" runat="server">
                </asp:ContentPlaceHolder>

            </ContentTemplate>
        </asp:UpdatePanel>

    </form>
</body>
</html>

// [ C# ]
namespace Foo
{
    public partial class Site : MasterPage
    {
    }
}


// Main.aspx
// [ HTML ]
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Main.aspx.cs" MasterPageFile="~/Site.Master" MaintainScrollPositionOnPostback="true" Inherits="Foo.Main" %>

<%@ Register Src="~/WindowSticker.ascx" TagName="ucWindowSticker" TagPrefix="ucWS" %>

<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder" runat="server">

    <h:AlertMessage runat="server" ID="alertMsg"></h:AlertMessage>

    <asp:TextBox ID="txtVINTarget" CssClass="form-control form-control-sm input-medium-width" runat="server" OnTextChanged="txtVINTarget_TextChanged" AutoPostBack="true"></asp:TextBox>

    <asp:UpdatePanel runat="server" UpdateMode="Conditional" ChildrenAsTriggers="true">
        <ContentTemplate>

            <asp:MultiView ID="MultiViewMain" runat="server">
                <asp:View ID="ViewWindowSticer" runat="server">
                    <asp:Panel ID="windowStickerPanel" runat="server">
                        <ucWS:ucWindowSticker ID="ucWindowStickerView" runat="server" />
                    </asp:Panel>
                </asp:View>
             </asp:MultiView>

        </ContentTemplate>
    </asp:UpdatePanel>

</asp:Content>


// [ C# ]
namespace Foo
{
    public partial class Main : SitePageBase<Main>
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            //alertMsg.Hide();

            if (!IsPostBack)
            {
            }
        }

        protected void txtVINTarget_TextChanged(object sender, EventArgs e)
        {
        }
    }
}


// WindowSticker.ascx
// [ HTML ]
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="WindowSticker.ascx.cs" Inherits="Foo.WindowSticker" %>

<asp:Button ID="btnGeneratePdf" runat="server" Text="Print" OnClick="btnGeneratePdf_Click" />


// [ C# ]
namespace Foo
{
    public partial class WindowSticker : SiteUserControlBase<WindowSticker>
    {
        protected void btnGeneratePdf_Click(object sender, EventArgs e)
        {
            var vin = ((TextBox)Parent.FindControl("txtVINTarget")).Text;

            if (string.IsNullOrEmpty(vin)) {
                ParentMsgBox("VIN is required");
                return;
            }
        }

        private void ParentMsgBox(string message)
        {
            var alertMsg = (AlertMessage)Parent.FindControl("alertMsg");
            alertMsg.Message = message;
            alertMsg.Show();
        }
    }
}
 

Комментарии:

1. Запускает ли какое-либо действие обновление панели обновления ? После alertMsg.Show(); того, как вы попытаетесь разместить объявление updatepanel .Update(); , в ваших панелях обновления нет атрибута ID, вам наверняка придется его добавить