Почему эта бритвенная страница возвращает нулевое свойство для Model.People?

People.cshtml.cs

public class PeopleModel : PageModel
{
    [BindProperty]
    public List<PeopleObj> People { get; set; }

    public void OnGet()
    {
        List<PeopleObj> People = GetPeople().ToList();//returns 4 people
    }
}

People.cshtml

@page
@model MyProject.Pages.PeopleModel

@foreach (var item in Model.People){
//Model.People is null 
}

Происходит то, что вызывается OnGet и заполняется список людей, но затем, когда происходит обращение к представлению, оно выдает исключение System.NullReferenceException: «Ссылка на объект не установлена ​​на экземпляр объекта». на Модель.Люди. People не указан для представления. Я не понимаю, почему он перезаписывается нулевым значением после установки в OnGet.

ИЗМЕНИТЬ Похоже, проблема в объявлении типа. Я все еще хотел бы знать, почему это ломает модель.

List<PeopleObj> People =
0
User970008 10 Фев 2021 в 19:04

1 ответ

Лучший ответ

Поскольку вы используете List<PeopleObj> People = GetPeople().ToList();//returns 4 people, вы просто создаете новый список, а не инициализировали [BindProperty]public List<PeopleObj> People { get; set; }. Поэтому, когда вы используете foreach, список (Model.People) имеет значение null. Null не может быть foreach.

Люди: введите описание изображения здесь

Решение:

Если вы хотите установить свойство PeopleModel, вы можете изменить

List<PeopleObj> People = GetPeople().ToList();

К

People = GetPeople().ToList();

И тогда вы все равно можете получить отредактированные данные из обработчика People in OnPost.

Вот демо:

Модель:

public class PeopleObj 
        {
            public int Id { get; set; }
            public string Name { get; set; }
    
        }

People.cshtml:

<form method="post">
    @{var count = 0;}
    @foreach (var item in Model.People)
    {
        <div class="form-group">
            <label class="control-label">Id</label>
            <input class="form-control" value="@item.Id" name="People[@count].Id"/>
        </div>
        <div class="form-group">
            <label class="control-label">Name</label>
            <input class="form-control" value="@item.Name" name="People[@count].Name" />

        </div>
        count++;
    }
    <input type="submit" value="submit" />
</form>

People.cshtml.cs:

public class PeopleModel : PageModel
    {
        [BindProperty]
        public List<PeopleObj> People { get; set; }

        public void OnGet()
        {
            People = new List<PeopleObj> { 
                new PeopleObj{  Id=1, Name="person1"},
                new PeopleObj{  Id=2, Name="person2"},
                new PeopleObj{  Id=3, Name="person3"},
                new PeopleObj{  Id=4, Name="person4"}
            };
        }
        public void OnPost()
        {
            //get edited data from People
            List<PeopleObj> EditedPeople = People;
        }
    }

Результат: введите описание изображения здесь

0
Yiyi You 11 Фев 2021 в 03:13