如何解决C# 我正在尝试使用自定义类创建 Web 用户控件,但我得到的对象未设置为对象错误的实例
希望你能帮我解决这个问题。我正在创建一个内部 webforms asp.net 站点来显示不同类别的内部使用文档列表。
我决定创建一个自定义文档类来放入一个列表来保存文档,然后创建一个自定义 Web 用户控件来在网站上的任何位置显示文档。
文档类位于我的 App_Code 文件夹中的通用类文件中。
cabinet.cs
public class Document
{
private string _Url;
private string _Title;
public Document(string URL,string Title)
{
_Url = URL;
_Title = Title;
}
public string URL
{
get { return _Url; }
set { _Url = value; }
}
public string Title
{
get { return _Title; }
set { _Title = value; }
}
}
此代码工作正常。然后在我的用户控件中创建一个文档类型列表并在 Page_Load() 中启动它。然后我创建了一个公共方法来将新文档添加到列表中。
DocDisplay.ascx.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
public partial class DocDisplay : System.Web.UI.UserControl
{
private List<Document> _DocList;
protected void Page_Load(object sender,EventArgs e)
{
_DocList = new List<Document>();
}
public void Add(string URL,string Title)
{
_DocList.Add(new Document(URL,Title));
}
public void WriteDocuments()
{
foreach (Document doc in _DocList)
{
Response.Write($"<span class='document'><a href='{doc.URL}'>{doc.Title}</a></span>");
}
}
}
我在 add 方法中遇到错误。它说我的对象不是对象的实例。但我在 Page_Load 中这样做。
index.aspx.cs
protected void Page_Load(object sender,EventArgs e)
{
pageDocs.Add("index.aspx","Hello World!");
pageDocs.Add("index.aspx","Red Rum");
pageDocs.Add("index.aspx","Lorum Ipsum");
}
我已经在我的索引页中注册了我的用户控件。
<%@ Register Src="~/DocDisplay.ascx" TagPrefix="uc" TagName="DocDisplay" %>
<uc:DocDisplay ID="pageDocs" runat="server" />
所以我不确定为什么我会收到这个错误。据我所知,我的代码没有任何问题。如果您能提供帮助,我将不胜感激。
解决方法
事件从控制层次结构的根开始到叶节点结束。 Index.Page_Load
在 DocDisplay.Page_Load
有机会实例化列表之前被调用。
_DocList
字段需要一个值才能被任何东西使用,因此需要尽早进行初始化。使用字段初始值设定项可以很容易地实现这一点。一次性声明并分配它:
private List<Document> _DocList = new List<Document>();
当 Index
类在页面生命周期的早期实例化其子控件时,_DocList
将立即拥有一个对象引用。
很容易说,“Page_Init 将被更快地调用;我会在那里完成它。”一开始这可能会奏效,但是如果您执行任何 动态控制加载,您很快就会发现这是一种平衡行为。动态加载的控件必须播放事件追赶,因此可以在静态加载的控件开始触发 Init
事件后触发其 Load
事件。将每个事件用于其目的而不是其计时很重要,并使用构造函数(和字段初始值设定项)来初始化非控制类状态。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。