服务器在Page_Load中控制null

发布于 2024-11-09 04:31:44 字数 4306 浏览 4 评论 0原文

我有一个页面,其中包含一些服务器控件。由于某种原因,这些控件在页面的 Page_Load 事件处理程序中为空。

    <asp:Content ID="mainContent" runat="server" ContentPlaceHolderID="mainPlaceholder">
    <asp:Label ID="userIdLockedLabel" runat="server" EnableViewState="False" ForeColor="Red"
        Visible="False">
    </asp:Label>
<asp:Panel ID="standardLoginPanel" runat="server">
    <asp:Login ID="loginControl" runat="server" 
        DisplayRememberMe="false" 
        PasswordRecoveryUrl="?action=lostpass"
        TextBoxStyle-Font-Names="verdana" 
        TextBoxStyle-Font-Size="Small" 
        DestinationPageUrl="Home.aspx" 
        OnLoggingIn="OnLoggingIn" 
        OnLoginError="OnError" 
        TitleText="" >
        <TextBoxStyle Font-Names="verdana" Font-Size="Small"></TextBoxStyle>
        <LoginButtonStyle CssClass="btn" />
    </asp:Login>
</asp:Panel>
<asp:Panel ID="canadaLoginPanel" runat="server" Visible="false">
    <asp:Label ID="userFailureLabel" runat="server"></asp:Label>
    <table>
        <tr>
            <td><%= Utility.RetrieveResource("CompanyNumberLabel") %></td>
            <td><asp:TextBox ID="companyNumberTextbox" runat="server"></asp:TextBox></td>
        </tr>
        <tr>
            <td><%= Utility.RetrieveResource("UserIdLabel")%></td>
            <td><asp:TextBox ID="userIdTextbox" runat="server"></asp:TextBox></td>
        </tr>
        <tr>
            <td><%= Utility.RetrieveResource("PasswordLabel")%></td>
            <td><asp:TextBox ID="userPasswordTextbox" runat="server" TextMode="Password"></asp:TextBox></td>
        </tr>
        <tr>
            <td colspan="2">
                <asp:CheckBox ID="rememberMeCheckBox" runat="server" />
            </td>
        </tr>
        <tr>
            <td colspan="2" style="text-align:center"><asp:Button ID="userSubmit" runat="server" CssClass="btn" /></td>
        </tr>
        <tr>
            <td colspan="2" style="text-align:center"><a href="ForgotPassword.aspx"><%= Utility.RetrieveResource("ForgotPasswordLinkText") %></a></td>
        </tr>
    </table>
</asp:Panel>
    <br />
    <div style="font-family: Verdana; font-size: small">
        <span class="bold">
            <%= Utility.RetrieveResource("TroubleLogginIn") %>
        </span><br />
        <%= Utility.RetrieveResource("ForgotPasswordText") %>
    </div>

页面login.aspx 继承自LogOnBasePage,这就是Page_Load 代码所在的位置。在那里,我使用以下代码:

                if (this.Company.SiteType == Ceridian.KB.Entities.SiteType.CAN)
            {
                this.FindControlRecursive("standardLoginPanel").Visible = false;
                this.FindControlRecursive("canadaLoginPanel").Visible = true;
                ((Button)this.FindControlRecursive("userSubmit")).Text = Utility.RetrieveResource("LoginButtonText");
                this.Login = null;
                CheckBox rememberMe = (CheckBox)this.FindControlRecursive("rememberMeCheckBox");
                rememberMe.Text = Utility.RetrieveResource("RememberMeText");
            }

这是 FindControlRecursive 方法的内容。

        public static Control FindControlRecursive(this Control control, string controlId)
    {
        if (string.Compare(control.ID, controlId, StringComparison.OrdinalIgnoreCase) == 0)
        {
            // We found the control!
            return control;
        }
        else
        {
            // Recurse through ctrl's Controls collections
            foreach (Control child in control.Controls)
            {
                Control lookFor = FindControlRecursive(child, controlId);

                if (lookFor != null)
                {
                    // We found the control
                    return lookFor;
                }
            }

            // If we reach here, control was not found
            return null;
        }
    }

我总是在 if 检查的第一行得到一个空引用。我不明白这怎么可能。

I have a page that has some server controls in it. For some reason these controls are null in the page's Page_Load event handler.

    <asp:Content ID="mainContent" runat="server" ContentPlaceHolderID="mainPlaceholder">
    <asp:Label ID="userIdLockedLabel" runat="server" EnableViewState="False" ForeColor="Red"
        Visible="False">
    </asp:Label>
<asp:Panel ID="standardLoginPanel" runat="server">
    <asp:Login ID="loginControl" runat="server" 
        DisplayRememberMe="false" 
        PasswordRecoveryUrl="?action=lostpass"
        TextBoxStyle-Font-Names="verdana" 
        TextBoxStyle-Font-Size="Small" 
        DestinationPageUrl="Home.aspx" 
        OnLoggingIn="OnLoggingIn" 
        OnLoginError="OnError" 
        TitleText="" >
        <TextBoxStyle Font-Names="verdana" Font-Size="Small"></TextBoxStyle>
        <LoginButtonStyle CssClass="btn" />
    </asp:Login>
</asp:Panel>
<asp:Panel ID="canadaLoginPanel" runat="server" Visible="false">
    <asp:Label ID="userFailureLabel" runat="server"></asp:Label>
    <table>
        <tr>
            <td><%= Utility.RetrieveResource("CompanyNumberLabel") %></td>
            <td><asp:TextBox ID="companyNumberTextbox" runat="server"></asp:TextBox></td>
        </tr>
        <tr>
            <td><%= Utility.RetrieveResource("UserIdLabel")%></td>
            <td><asp:TextBox ID="userIdTextbox" runat="server"></asp:TextBox></td>
        </tr>
        <tr>
            <td><%= Utility.RetrieveResource("PasswordLabel")%></td>
            <td><asp:TextBox ID="userPasswordTextbox" runat="server" TextMode="Password"></asp:TextBox></td>
        </tr>
        <tr>
            <td colspan="2">
                <asp:CheckBox ID="rememberMeCheckBox" runat="server" />
            </td>
        </tr>
        <tr>
            <td colspan="2" style="text-align:center"><asp:Button ID="userSubmit" runat="server" CssClass="btn" /></td>
        </tr>
        <tr>
            <td colspan="2" style="text-align:center"><a href="ForgotPassword.aspx"><%= Utility.RetrieveResource("ForgotPasswordLinkText") %></a></td>
        </tr>
    </table>
</asp:Panel>
    <br />
    <div style="font-family: Verdana; font-size: small">
        <span class="bold">
            <%= Utility.RetrieveResource("TroubleLogginIn") %>
        </span><br />
        <%= Utility.RetrieveResource("ForgotPasswordText") %>
    </div>

The page, login.aspx inherits from LogOnBasePage, and that is where the Page_Load code is. In there, I use the following code:

                if (this.Company.SiteType == Ceridian.KB.Entities.SiteType.CAN)
            {
                this.FindControlRecursive("standardLoginPanel").Visible = false;
                this.FindControlRecursive("canadaLoginPanel").Visible = true;
                ((Button)this.FindControlRecursive("userSubmit")).Text = Utility.RetrieveResource("LoginButtonText");
                this.Login = null;
                CheckBox rememberMe = (CheckBox)this.FindControlRecursive("rememberMeCheckBox");
                rememberMe.Text = Utility.RetrieveResource("RememberMeText");
            }

Here is the content of the FindControlRecursive method.

        public static Control FindControlRecursive(this Control control, string controlId)
    {
        if (string.Compare(control.ID, controlId, StringComparison.OrdinalIgnoreCase) == 0)
        {
            // We found the control!
            return control;
        }
        else
        {
            // Recurse through ctrl's Controls collections
            foreach (Control child in control.Controls)
            {
                Control lookFor = FindControlRecursive(child, controlId);

                if (lookFor != null)
                {
                    // We found the control
                    return lookFor;
                }
            }

            // If we reach here, control was not found
            return null;
        }
    }

I always get a null reference on the first line inside the if check. I don't see how this is possible.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

情话已封尘 2024-11-16 04:31:44

您可能需要在页面生命周期的后期等待。尝试将其放入 page_prerendercomplete 事件中,如下所示

    Page_PreRenderComplete(Object sender, EventArgs e)
{
 if (this.Company.SiteType == Ceridian.KB.Entities.SiteType.CAN)
            {
                this.FindControlRecursive("standardLoginPanel").Visible = false;
                this.FindControlRecursive("canadaLoginPanel").Visible = true;
                ((Button)this.FindControlRecursive("userSubmit")).Text = Utility.RetrieveResource("LoginButtonText");
                this.Login = null;
                CheckBox rememberMe = (CheckBox)this.FindControlRecursive("rememberMeCheckBox");
                rememberMe.Text = Utility.RetrieveResource("RememberMeText");
}

It might be that you need to wait later in the page lifecycle. try putting it in the page_prerendercomplete event like this

    Page_PreRenderComplete(Object sender, EventArgs e)
{
 if (this.Company.SiteType == Ceridian.KB.Entities.SiteType.CAN)
            {
                this.FindControlRecursive("standardLoginPanel").Visible = false;
                this.FindControlRecursive("canadaLoginPanel").Visible = true;
                ((Button)this.FindControlRecursive("userSubmit")).Text = Utility.RetrieveResource("LoginButtonText");
                this.Login = null;
                CheckBox rememberMe = (CheckBox)this.FindControlRecursive("rememberMeCheckBox");
                rememberMe.Text = Utility.RetrieveResource("RememberMeText");
}
毁我热情 2024-11-16 04:31:44

您继承的页面是否使用标记文件(例如 LogOnBasePage.aspx)?

如果是这样,那么我认为你继承它的运气不好。标记页面生成一个类,该类继承自代码隐藏页面中定义的类。该生成的类的职责之一是实例化标记中定义的控件。如果您从 LogOnBasePage 继承,您的新页面将没有从 LogOnBasePage 标记实例化控件所需的代码,因此您将获得空引用。

Does the page you are inheriting from use a markup file (e.g. LogOnBasePage.aspx)?

If so then I think you are out of luck inheriting from it. The markup page generates a class that inherits from the class defined in the code behind page. One of the responsibilities of this generated class is to instantiate the controls defined in the markup. If you inherit from LogOnBasePage your new page will not have the code necessary to instantiate the controls from LogOnBasePage markup and therefore you will get null references.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文