Ram*_*esh 0 c# asp.net-core razor-pages asp.net-core-2.1
我正在尝试将值分配给Model另一个 at OnGetAsyncinRazor Page以进行一些数据验证,并将它们分配回实际ModelonOnPostAsync以保存数据。
我NullReferenceException在这一行出错Input.TestName = TestData.TestName;
public class TestData
{
    [Key]
    public int TestID { get; set; }
    public string TestName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
页面模型
    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");
    }
Run Code Online (Sandbox Code Playgroud)
我试过TestName在外面InputModel class工作得很好,但我有很多属性可以这样使用。所以我想把它们放在一起class
请建议我在这里缺少什么。
正如您在问题中确认在TestData.TestName调试器中查看时具有值一样,您应该将注意力转向Input.TestName. 更具体地说,这可能意味着该Input属性本身是null,这将导致您的NullReferenceException.
这也有道理。当OnPostAsync被调用时,ASP.NET核心尝试绑定到你的Input使用请求中的数据,这会导致其创建的实例属性InputModel为您服务。这是通过使用[BindProperty]您在Input属性本身上设置的属性来启用的。
但是,当OnGetAsync被调用时,不会发生相同的过程。默认情况下,[BindProperty]只会触发非 GET 请求来执行此绑定,这意味着Input您的OnGetAsync调用内部将是null(这是引用类型属性的默认值)。
要解决此问题,请在尝试设置其值之前更新您的OnGetAsync实现以创建其自己的实例。这是实现这一目标的一种方法:InputTestName
public async Task<IActionResult> OnGetAsync(int? id)
{
    TestData = await _context.TestData.FirstOrDefaultAsync(m => m.TestID == id);
    Input = new InputModel { TestName = TestData.TestName };
    return Page();
}
Run Code Online (Sandbox Code Playgroud)
还值得记住的FirstOrDefaultAsync是TestData,null如果 id 不匹配,您的呼叫将设置为,这将为您提供不同的NullReferenceException.
|   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           1068 次  |  
        
|   最近记录:  |