Присвойте значения модели из другой в OnGetAsync на странице Razor

Я пытаюсь присвоить значения Model от другого в OnGetAsync в Razor Page для проверки некоторых данных и присвоить их обратно фактическим Model на OnPostAsync для сохранения данных.

я получил 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");
    }

Я старался TestName вне InputModel class который работает хорошо, но у меня есть много свойств, чтобы использовать, как это. поэтому я хотел поставить их под одним class

Пожалуйста, предложите, что мне здесь не хватает.

1 ответ

Решение

Как вы подтвердили в своем вопросе, что TestData.TestName имеет значение при просмотре в отладчике, вы должны обратить свое внимание на Input.TestName, Более конкретно, это, вероятно, означает, что Input Само свойство null, что приведет к вашему NullReferenceException,

Это тоже имеет смысл. когда OnPostAsync ASP.NET Core пытается привязать к вашему Input свойство с использованием данных из запроса, в результате чего создается экземпляр InputModel для тебя. Это включено с использованием [BindProperty] атрибут у вас на месте на Input собственность

Однако когда OnGetAsync называется, такой же процесс не происходит. По умолчанию, [BindProperty] будет только запускать не-GET запросы для выполнения этой привязки, что означает Input внутри вашего OnGetAsync звонок будет 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();
}

Также стоит помнить, что ваш звонок FirstOrDefaultAsync собирается установить TestData в null если идентификатор не совпадает, что даст вам другое NullReferenceException,

Другие вопросы по тегам