Присвойте значения модели из другой в 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
,