'Members' 对象引用未设置为对象的实例
'Members' Object reference not set to instance of an object
给定 ASP.NET WebForms 应用程序和以下内容(仅浓缩为相关引用),当我触发 PostBack 事件时,如何修复未设置为对象实例的对象引用?
UserControl 代码隐藏:
namespace UserControls.Core
{
using ...
public partial class MemberDetails : PortalControl
{
protected List<Member> Members;
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
Members = new List<Member>()
{
new Member(1, "John Paul", "Jones"),
new Member(2, "Henry", "Avery")
}
}
}
protected void btnEditMember_Click(object sender, EventArgs e)
{
var members = Members; // null
int id = int.Parse(txtSelectedId.Value);
// Exception thrown here
// Object reference not set to an instance of an object
Member member = members.Where(i => i.id == id).FirstOrDefault();
}
}
}
用户控件:
<asp:LinkButton runat="server" ID="btnEditMember"
CssClass="btn btn-item-control text-muted"
OnClientClick="return btnSelectMember_Click(2);"
OnClick="btnEditMember_Click">
<i class="fas fa-edit"></i>
</asp:LinkButton>
为什么在btnEditMember_Click()
事件中Members
是null
?我对这种遗留类型的应用程序不是很熟悉,我仍在学习 WebForms 的来龙去脉。我是否必须在声明时或 if (!Page.IsPostBack)
检查之外为 Members
分配一个值?
Web 应用程序是无状态的。每次将页面回发到服务器时,都会创建 class(页面、控件等)的全新实例。当创建 class 的实例时,Members
默认为 null
:
protected List<Member> Members;
目前,当 IsPostBack
为 false
时,您只能在初始页面加载时填充它。如果您想在每个页面请求中填充它,请从 if (!IsPostBack)
条件中删除该逻辑并始终执行 Members
.
的初始化
当然还要注意,如果您有 修改 Members
的逻辑,这些修改将在 post-back 上丢失。要保留该状态,您需要将其存储在某个地方。会话状态、数据库、文件,随心所欲。
使用 Web 表单时,最好参考 ASP.NET PAge Lifecycle。
给定 ASP.NET WebForms 应用程序和以下内容(仅浓缩为相关引用),当我触发 PostBack 事件时,如何修复未设置为对象实例的对象引用?
UserControl 代码隐藏:
namespace UserControls.Core
{
using ...
public partial class MemberDetails : PortalControl
{
protected List<Member> Members;
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
Members = new List<Member>()
{
new Member(1, "John Paul", "Jones"),
new Member(2, "Henry", "Avery")
}
}
}
protected void btnEditMember_Click(object sender, EventArgs e)
{
var members = Members; // null
int id = int.Parse(txtSelectedId.Value);
// Exception thrown here
// Object reference not set to an instance of an object
Member member = members.Where(i => i.id == id).FirstOrDefault();
}
}
}
用户控件:
<asp:LinkButton runat="server" ID="btnEditMember"
CssClass="btn btn-item-control text-muted"
OnClientClick="return btnSelectMember_Click(2);"
OnClick="btnEditMember_Click">
<i class="fas fa-edit"></i>
</asp:LinkButton>
为什么在btnEditMember_Click()
事件中Members
是null
?我对这种遗留类型的应用程序不是很熟悉,我仍在学习 WebForms 的来龙去脉。我是否必须在声明时或 if (!Page.IsPostBack)
检查之外为 Members
分配一个值?
Web 应用程序是无状态的。每次将页面回发到服务器时,都会创建 class(页面、控件等)的全新实例。当创建 class 的实例时,Members
默认为 null
:
protected List<Member> Members;
目前,当 IsPostBack
为 false
时,您只能在初始页面加载时填充它。如果您想在每个页面请求中填充它,请从 if (!IsPostBack)
条件中删除该逻辑并始终执行 Members
.
当然还要注意,如果您有 修改 Members
的逻辑,这些修改将在 post-back 上丢失。要保留该状态,您需要将其存储在某个地方。会话状态、数据库、文件,随心所欲。
使用 Web 表单时,最好参考 ASP.NET PAge Lifecycle。