我有一个非常奇怪的情况,我的Label控件在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>
在网络表单的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时失败,因为控件为null。这怎么可能呢?控件的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
解决方案: 我自己就找到了答案。在页面上为usercontrol使用此声明修复了问题:
<%@ Register TagPrefix="cw" TagName="ArticleColumn" Src="~/Templates/Units/ArticleColumn.ascx" %>
使用来自html视图的ReSharper右键菜单添加了这个错误的声明:
<%@ Register TagPrefix="cw" Namespace="MyNamespace.Templates.Units" Assembly="MyNamespace" %>
感谢您的帮助! :)
答案 0 :(得分:17)
我在上面回答了我自己的问题。
解决方案:我自己就找到了答案。在页面上为usercontrol使用此声明修复了问题:
<%@ Register TagPrefix="cw" TagName="ArticleColumn" Src="~/Templates/Units/ArticleColumn.ascx" %>
使用来自html视图的ReSharper右键菜单添加了这个错误的声明:
<%@ Register TagPrefix="cw" Namespace="MyNamespace.Templates.Units" Assembly="MyNamespace" %>
感谢您的帮助! :)
答案 1 :(得分:1)
DataBind用于将用aspx部分编写的控件与服务器端脚本绑定,即&lt; %%&gt ;.
但您的方案不需要调用databind()。只是将值分配给控件应该可以正常工作。
尝试从代码中删除数据绑定。
答案 2 :(得分:0)
从页面更新用户控件的内容。
在用户控件中声明属性以更新标签内容,并使用具有用户控件实例的页面中的这些属性。