【问题标题】:Assign values to a Model from another at OnGetAsync in Razor Page在 Razor 页面中的 OnGetAsync 将值分配给另一个模型
【发布时间】:2019-01-18 23:57:17
【问题描述】:

我正在尝试将值从 Razor Page 中的另一个 OnGetAsync 分配给 Model 以进行一些数据验证,并将它们分配回 OnPostAsync 上的实际 Model 以保存数据。

我在这一行收到NullReferenceException 错误Input.TestName = TestData.TestName;

public class TestData
{
    [Key]
    public int TestID { get; set; }
    public string TestName { get; set; }
}

页面模型

    private readonly Test.Models.TestContext _context;
    public EditModel(Test.Models.TestContext context)
    {
        _context = context;
    }
    [BindProperty]
    public TestData TestData { get; set; }

    [BindProperty]
    public InputModel Input { get; set; }

    public class InputModel
    {
        [Required, MaxLength(50), MinLength(3)]
        public string TestName { get; set; }
    }

    public async Task<IActionResult> OnGetAsync(int? id)
    {
        TestData = await _context.TestData.FirstOrDefaultAsync(m => m.TestID == id);
        Input.TestName = TestData.TestName; //Error Occurs here. TestData.TestName has value while debug.
        return Page();
    }

    public async Task<IActionResult> OnPostAsync()
    {
        TestData.TestName = Input.TestName;
        _context.Attach(TestData).State = EntityState.Modified;
        await _context.SaveChangesAsync();
        return RedirectToPage("./Index");
    }

我在InputModel class 之外尝试了TestName,它运行良好,但我有很多像这样使用的属性。所以我想把它们放在一个class

请提出我在这里缺少的内容。

【问题讨论】:

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


    【解决方案1】:

    正如您在问题中确认 TestData.TestName 在调试器中查看时具有值,您应该将注意力转向 Input.TestName。更具体地说,这可能意味着Input 属性本身是null,这将导致您的NullReferenceException。

    这也是有道理的。当调用OnPostAsync 时,ASP.NET Core 会尝试使用请求中的数据绑定到您的Input 属性,这会导致它为您创建InputModel 的实例。这是通过使用您在 Input 属性本身上的 [BindProperty] 属性来启用的。

    但是,当调用OnGetAsync 时,不会发生相同的过程。默认情况下,[BindProperty] 只会触发非 GET 请求来执行此绑定,这意味着您的 OnGetAsync 调用中的 Input 将是 null(这是引用类型属性的默认设置)。

    要解决此问题,请先更新您的 OnGetAsync 实现以创建自己的 Input 实例,然后再尝试设置其 TestName 值。这是实现这一目标的一种方法:

    public async Task<IActionResult> OnGetAsync(int? id)
    {
        TestData = await _context.TestData.FirstOrDefaultAsync(m => m.TestID == id);
        Input = new InputModel { TestName = TestData.TestName };
        return Page();
    }
    

    还值得记住的是,如果 id 不匹配,您对 FirstOrDefaultAsync 的调用会将 TestData 设置为 null,这将为您提供不同的 NullReferenceException。

    【讨论】:

    • TestData 正在由 await 分配...是否有默认原因导致未收到 NullReference 错误。
    • 对不起,我不明白之前的评论。你试过我提供的代码示例了吗?
    • 是的,它在工作 Kirk,之前的评论是当 TestData 被分配时没有实例,为什么不是 Input。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-28
    • 1970-01-01
    • 1970-01-01
    • 2018-11-16
    • 2019-07-01
    • 2019-05-09
    • 2022-12-13
    相关资源
    最近更新 更多