'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()事件中Membersnull?我对这种遗留类型的应用程序不是很熟悉,我仍在学习 WebForms 的来龙去脉。我是否必须在声明时或 if (!Page.IsPostBack) 检查之外为 Members 分配一个值?

Web 应用程序是无状态的。每次将页面回发到服务器时,都会创建 class(页面、控件等)的全新实例。当创建 class 的实例时,Members 默认为 null

protected List<Member> Members;

目前,当 IsPostBackfalse 时,您只能在初始页面加载时填充它。如果您想在每个页面请求中填充它,请从 if (!IsPostBack) 条件中删除该逻辑并始终执行 Members.

的初始化

当然还要注意,如果您有 修改 Members 的逻辑,这些修改将在 post-back 上丢失。要保留该状态,您需要将其存储在某个地方。会话状态、数据库、文件,随心所欲。

使用 Web 表单时,最好参考 ASP.NET PAge Lifecycle