#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, вам наверняка придется его добавить