#.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. Понятно. Я прочитаю этот документ, чтобы лучше ознакомиться. Спасибо.