Ссылка на объект ‘Members’ не установлена на экземпляр объекта

#.net #webforms

#.net #веб-формы

Вопрос:

Учитывая ASP.NET Приложение WebForms и следующее (сведенное только к соответствующим ссылкам), как мне исправить ссылку на объект, не установленную на экземпляр объекта, когда я запускаю событие обратной передачи?

Код пользовательского контроля, лежащий в основе:

 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>
  

Почему это Members есть null в btnEditMember_Click() событии? Я не очень хорошо знаком с этим устаревшим типом приложений, я все еще изучаю входы и выходы WebForms. Должен ли я присваивать Members значение либо при объявлении, либо вне if (!Page.IsPostBack) проверки?

Ответ №1:

Веб-приложения не имеют состояния. Каждый раз, когда страница отправляется обратно на сервер, создается совершенно новый экземпляр класса (страница, элемент управления и т.д.). И Members устанавливается по умолчанию null при создании экземпляра класса:

 protected List<Member> Members;
  

В настоящее время вы заполняете ее только при начальной загрузке страницы, когда IsPostBack есть false . Если вы хотите заполнять ее при каждом запросе страницы, удалите эту логику из if (!IsPostBack) условия и всегда выполняйте эту инициализацию Members .

Обратите внимание, конечно, также, что если у вас есть логика, которая изменяет Members , эти изменения будут потеряны при возврате. Чтобы сохранить это состояние, вам нужно будет его где-нибудь сохранить. Состояние сеанса, база данных, файл, где угодно.

При использовании веб-форм всегда полезно ссылаться на ASP.NET Жизненный цикл страницы.

Комментарии:

1. Понятно. Я прочитаю этот документ, чтобы лучше ознакомиться. Спасибо.