【问题标题】:ASPNET WebForms Server Control is NULL in Page_LoadASP NET Web 窗体服务器控件在 Page_Load 中为 NULL
【发布时间】:2012-10-29 14:29:54
【问题描述】:

我有一个非常奇怪的情况,我的标签控件在 Page_Load 中为 NULL。有可能吗?

我有一个 Web 表单:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="MyNamespace.Templates.Pages.WebForm1" %>
<%@ Register TagPrefix="cw" Namespace="MyNamespace.Templates.Units" Assembly="MyNamespace" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div style="background-color:yellowgreen;">
        FIRST
    </div>
    <div style="background-color: wheat;">
        SECOND
        <cw:ArticleColumn runat="server" ID="ac" ArticleID="1899"/>
    </div>
    </form>
</body>
</html>

在web表单的Page_Load中,我简单的做了一个

if(!IsPostBack) DataBind();

用户控件 ArticleColumn 如下所示:

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="ArticleColumn.ascx.cs"  Inherits="MyNamespace.Templates.Units.ArticleColumn" %>
<h2><asp:Label runat="server" ID="myArticleHeading" Text="TOM" /></h2>
<p><asp:Label runat="server" ID="myArticleIntro" Text="TOM" /></p>
<asp:Label runat="server" ID="myArticleBody" Text="TOM" />

后面的代码是这样的:

public partial class ArticleColumn : UserControlBase<PageTypes.ArticleBase>
{
    public int ArticleID { get; set; }

    protected void Page_Load(object sender, EventArgs e)
    {
        var page = DataFactory.Instance.GetPage(new PageReference(ArticleID));

        myArticleHeading.Text = page.PageName;
        myArticleIntro.Text = page.Property["IntroText"] != null
                            ? page.Property["IntroText"].ToWebString()
                            : string.Empty;
        myArticleBody.Text = page.Property["MainBody"] != null
                            ? page.Property["MainBody"].ToWebString()
                            : string.Empty;

        DataBind();
    }
}

当我尝试设置 myArticleHeading.Text 时失败,因为控件为空。这怎么可能? ASP.NET 控件的自动绑定一定是失败了……

我尝试过: - 重启VS 2010 - 切换构建配置 - 清洁/重建 - 更改控件的名称以便更新设计器文件。

不用说,以上都不起作用。

编辑:添加堆栈跟踪:

[NullReferenceException: Object reference not set to an instance of an object.]
   MyNamespace.Templates.Units.ArticleColumn.Page_Load(Object sender, EventArgs e) in C:\DevProjects\CustomerWeb\Main\Source\MyNamespace\Templates\Units\ArticleColumn.ascx.cs:21
   System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e) +14
   System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) +35
   System.Web.UI.Control.OnLoad(EventArgs e) +91
   System.Web.UI.Control.LoadRecursive() +74
   System.Web.UI.Control.LoadRecursive() +146
   System.Web.UI.Control.LoadRecursive() +146
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +2207

解决方案: 我自己找到了答案。为页面上的用户控件使用此声明解决了问题:

<%@ Register TagPrefix="cw" TagName="ArticleColumn" Src="~/Templates/Units/ArticleColumn.ascx" %>

这个错误的声明是在 html 视图中使用 ReSharper 右键菜单添加的:

<%@ Register TagPrefix="cw" Namespace="MyNamespace.Templates.Units" Assembly="MyNamespace" %>

感谢您的帮助! :)

【问题讨论】:

  • 为什么在 Web 表单的页面加载和用户控件的页面加载时都对 DataBind 进行通用调用?事实上,你为什么要调用 databind 呢?另外,能否请您包括异常/堆栈跟踪?
  • 数据绑定是我解决问题的绝望尝试:S 将添加堆栈跟踪。
  • K,一个。摆脱那些 DataBind() 调用。他们什么也没做。二、前myArticleHeading.Text = page.PageName;行,添加: string sTest = page.PageName;目标是确认它不是为空的“页面”变量。
  • 解决方案是声明控件而不是声明命名空间(参见问题)。 ReSharper 在添加引用方面做得不好。
  • 如果您的问题得到解决,请将此问题设置为回答

标签: asp.net webforms nullreferenceexception


【解决方案1】:

我在上面回答了我自己的问题。

解决方案:我自己找到了答案。为页面上的用户控件使用此声明解决了问题:

<%@ Register TagPrefix="cw" TagName="ArticleColumn" Src="~/Templates/Units/ArticleColumn.ascx" %>

这个错误的声明是在 html 视图中使用 ReSharper 右键菜单添加的:

<%@ Register TagPrefix="cw" Namespace="MyNamespace.Templates.Units" Assembly="MyNamespace" %>

感谢您的帮助! :)

【讨论】:

  • 只是一个解释:你应该通过路径而不是程序集和命名空间来控制负载。小心它。
  • 我发现我必须在web.config 文件中注册控件才能正常工作
  • 谢谢!我花了一个小时试图找出问题的原因,如果不是这个答案,我会花更多的钱:)
  • 未来自己的注意事项:检查 Visual Studio Code 是否在文件顶部格式化了声明。
  • 我花了整个上午的时间试图了解发生了什么。 ReSharper 也将引用作为命名空间导入到 ascx 中。谢谢!
【解决方案2】:

DataBind 是用于将用 aspx 部分编写的控件与服务器端脚本(即 )绑定的东西。

但您的方案不需要调用 databind()。只需将值分配给控件即可。

尝试从代码中删除数据绑定。

【讨论】:

    【解决方案3】:

    从页面更新用户控件的内容。

    在用户控件中声明属性以更新标签内容并将页面中的这些属性与用户控件实例一起使用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-07
      • 1970-01-01
      • 1970-01-01
      • 2014-07-29
      • 2011-07-25
      • 1970-01-01
      • 2012-08-03
      相关资源
      最近更新 更多