提问人:DTB1243 提问时间:10/6/2023 更新时间:10/6/2023 访问量:25
ASCX 用户控件未显示
ASCX User control not showing up
问:
我正在向现有 Web 应用添加报告部分。该部分由两个页面组成,这两个页面通过两个不同的 .ascx 文件加载。我不允许修改任何关于如何加载组件(主要是导航栏和页面内容)的内部逻辑。在普通的常规 .aspx 页面中,我通过 Crystal 报表设置的报表显示在页面上,没有问题。但是,当我将相同的表单放入 .ascx 页面时,遵循与其他页面内容相同的逻辑,此页面或简单的“hello world”都不会加载。我已经检查了是否有某些脚本失败或内容容器未通过开发人员工具加载,但没有这样的事情。我已经在这个网站上寻找了其他可能的错误,但到目前为止还没有解决方案。
让我解释一下(根据我的有限理解)这个网站是如何加载其内容的。有一个母版页 (Masterpage.Master),其中包含加载它的任何页面的通用模板,例如整体网站颜色、主导航栏的布局、页眉、内容、页脚等。MasterPage.Master 与将加载该部分的导航栏的用户控件一起集成到 .aspx 页面中。对于报告,我会在这里放置要加载的报告类别到页面上。这就是我在报告部分实现这一点的方式。网站的所有其他部分的工作方式完全相同:
<%@ Page Title="" Language="C#" MasterPageFile="~/Project1/Masterpage.Master" AutoEventWireup="true" CodeBehind="Reporting.aspx.cs" Inherits="Project1.Reporting" %>
<%@ Register TagPrefix="sub" TagName="navSubReportsSalesOrders" Src="~/Controls/Navigation/SubSide/navSubReportsSalesOrders.ascx" %>
<%@ Register TagPrefix="sub" TagName="navSubReportsWorkOrders" Src="~/Controls/Navigation/SubSide/navSubReportsWorkOrders.ascx" %>
<asp:Content ID="Content1" ContentPlaceHolderID="Head" runat="server">
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="SubNav" runat="server">
<sub:navSubReportsSalesOrders runat="server" Visible="false" ID="navSubReportsSalesOrders" />
<sub:navSubReportsWorkOrders runat="server" Visible="false" ID="navSubReportsWorkOrders" />
</asp:Content>
<asp:Content ID="Content3" ContentPlaceHolderID="MainBody" runat="server">
<asp:PlaceHolder ID="contentPlaceHolder" runat="server"></asp:PlaceHolder>
</asp:Content>
这是它背后的代码:
private reportingSalesOrder ReportingSalesOrderControl {get; set;}
private reportingWorkOrder ReportingWorkOrderControl {get; set;}
private int screenId { get; set; }
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
navSubReportsSalesOrders.Click += SalesOrdersClick;
navSubReportsWorkOrders.Click += WorkOrdersClick;
string Screen = Request.QueryString["ScreenId"];
if (Screen == "REP001")
screenId = 1;
else if (Screen == "REP002")
screenId = 2;
}
//some more code goes here
private void SalesOrdersClick(object sender, EventArgs e)
{
Response.Redirect("/Reports.aspx?ScreenId=REP001");
}
private void WorkOrdersClick(object sender, EventArgs e)
{
Response.Redirect("/Reports.aspx?ScreenId=REP002");
}
这适用于报告。单击时会更改 URL。但是,问题出在第二部分。该变量稍后用于在标记中加载页面上的内容。以下代码适用于应用程序的每个部分,除了我添加的新报告部分。screenId
contentPlaceHolder
protected void OnLoad(object sender, EventArgs e)
{
base.OnLoad(e);
switch (screenId)
{
case 1:
ReportingSalesOrderControl = (reportingSalesOrder) Page.LoadControl("~/Controls/Reporting/reportingSalesOrder.ascx");
contentPlaceHolder.Controls.Add(ReportingSalesOrderControl);
break;
case 2:
ReportingWorkOrderControl = (reportingWorkOrder) Page.LoadControl("~/Controls/Reporting/reportingWorkOrder.ascx");
contentPlaceHolder.Controls.Add(ReportingWorkOrderControl);
break;
default:
ReportingSalesOrderControl = (reportingSalesOrder)Page.LoadControl("~/Controls/Reporting/reportingSalesOrder.ascx");
contentPlaceHolder.Controls.Add(ReportingSalesOrderControl);
break;
}
}
我正在使用它的水晶报告,并且在 .aspx 页面上,没有问题,报告加载。所以,我认为可能是存在一些兼容性错误,导致 Crystal Reports 无法通过 ascx 文件加载。因此,在备份代码后,我保留了 reportingSalesOrder.ascx 文件,如下所示:
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="reportingSalesOrder.ascx.cs" Inherits="Project1.Controls.Reporting.reportingSalesOrder" %>
<%@ Register Assembly="DevExpress.Web.v21.1, Version=21.1.12.0, Culture=neutral, PublicKeyToken=somethingsomething" Namespace="DevExpress.Web" TagPrefix="dx" %>
<%@ Register assembly="CrystalDecisions.Web, Version=13.0.4000.0, Culture=neutral, PublicKeyToken=somethingsomething" namespace="CrystalDecisions.Web" tagprefix="CR" %>
<div class="row">
<h1>HELLO WORLD</h1>
</div>
甚至没有加载。我有一个非常令人沮丧的空白区域,内容应该在其中,即使,再次,所有其他元素加载都没有问题。我看过其他教程,看过这里的其他问题,虽然这让我发现了一些错误(比如使用而不是),但它对最终结果没有影响。可能是什么问题?我已经坚持了好几天了。欢迎任何帮助。Page.Controls.Add
contentPlaceHolder.Controls.Add
答:
这最终是一个非常愚蠢的错误。我再次查看了其他文件,该方法的签名不是 But 而是OnLoad
protected void OnLoad(object sender, EventArgs e)
protected override void OnLoad(EventArgs e)
现在它起作用了。
上一个:WPF 自定义控件的使用和访问
下一个:在哪里执行内容视图业务逻辑操作
评论