ASCX 用户控件未显示

问题描述 投票:0回答:1

我正在向现有网络应用程序添加报告部分。该部分由通过两个不同的 .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
),但它对最终结果没有任何影响。可能是什么问题呢?我已经被这个问题困扰好几天了。欢迎任何帮助。

c# asp.net custom-controls ascx
1个回答
0
投票

这最终是一个非常愚蠢的错误。我再次查看了其他文件,

OnLoad
方法的签名不是
protected void OnLoad(object sender, EventArgs e)
而是
protected override void OnLoad(EventArgs e)

现在可以了。

© www.soinside.com 2019 - 2024. All rights reserved.