【问题标题】:Razor Pages PageModel is Returning Null PropertyRazor Pages PageModel 返回 Null 属性
【发布时间】:2021-05-14 08:29:03
【问题描述】:

为什么这个 razor 页面会返回 Model.People 的 null 属性?

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: 'Object reference not set to an instance of an object。在 Model.People 上。 People 对于视图为空。我不明白为什么在 OnGet 中设置后会被空值覆盖。

编辑 似乎问题在于声明类型。我仍然想知道为什么这会破坏模型。

List<PeopleObj> People =

【问题讨论】:

  • 似乎问题在于声明类型是问题。我仍然会对幕后发生的事情感兴趣。它是在实例化一个新对象吗?申报的财产是否被埋在某个地方?任何深入了解页面周期或模型的细节都会有所帮助。
  • 这里没有专家,但是你为什么要在你自己初始化的时候绑定 People 对象(绑定的意思是:从 HTTP 请求数据加载它)?可能是绑定过程在您的初始化发生后重置了该值。但这只是猜测。
  • 我包含 BindProperty 只是因为它确实从请求 onPost 中绑定。 onGet 填充用户列表,然后可以对其进行编辑和回发。我认为在这种情况下它是无关紧要的,但我包括它是因为它在那里,我不确定它是否重要。谢谢

标签: c# asp.net-core razor razor-pages .net-5


【解决方案1】:

因为你使用List&lt;PeopleObj&gt; People = GetPeople().ToList();//returns 4 people,你只是创建了一个新列表,你没有初始化[BindProperty]public List&lt;PeopleObj&gt; People { get; set; }。 所以当你使用foreach时,list(Model.People)为null.null不能为foreach。

人:

解决方案:

如果你想设置PeopleModel的属性,你可以改变

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

People = GetPeople().ToList();

然后您仍然可以从 OnPost 处理程序中的 People 获取编辑后的数据。

这是一个演示:

型号:

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;
        }
    }

结果:

【讨论】:

    猜你喜欢
    • 2018-07-17
    • 2019-07-03
    • 2020-02-03
    • 2021-08-20
    • 1970-01-01
    • 1970-01-01
    • 2019-05-10
    • 2020-03-24
    • 1970-01-01
    相关资源
    最近更新 更多