Я занимаюсь разработкой приложения Asp.Net Core 2.1 с использованием Razor Pages. Я столкнулся со странным поведением. Проблема в том, что когда я отправляю форму, проверка на стороне клиента проходит с заполнением всех необходимых свойств, нотогда проверка завершается неудачно с проверкой ModelState.IsValid, и причина в том, что ModelState содержит требуемые строковые свойства дважды, одно с введенным значением и одно с нулевым значением, поэтому проверка завершается неудачей!
{[ BankName , Microsoft.AspNetCore.Mvc.ModelBinding.ModelStateDictionary + ModelStateNode]}
{[ BankAccount.BankName , Microsoft.AspNetCore.Mvc.ModelBinding.ModelStateD+ ModelStateNode]}
См., BankAccount является классом модели, а BankName является обязательным свойством. Я не знаю, почему свойство появляется дваждыв словаре ModelState, один с именем модели (с введенными данными) и один без имени модели (с нулевым значением) Любая идея, почему это происходит?
public class BankAccount
{
[DisplayName("")]
public int BankAccountId { get; set; }
[MaxLength(20, ErrorMessage = "")]
[Required(ErrorMessage = "")]
[DisplayName("")]
public string BankName { get; set; }
...
Здесь 'код OnPost (), в котором проверка завершается неудачно:
public async Task<IActionResult> OnPostAsync()
{
// TODO: Not ideal! But solves the problem of returning invalid model state.
ModelState.Remove("BankName");
if (!ModelState.IsValid)
{
return RedirectToPage();
}
_context.BankAccounts.Add(BankAccount);
await _context.SaveChangesAsync();
return RedirectToPage();
}
После поиска много я нашел обходной путь, который не очень идеален. Это то, что нужно удалить дополнительное свойство, которое было странным образомвставлен в словарь ModelState.Я имею в виду эту строку:
ModelState.Remove("BankName");
Но это не правильный путь. Я хотел бы выяснить, почему это происходит?!
Вот два свойства, определенные в PageModel:
[BindProperty]
public BankAccount BankAccount { get; set; }
[BindProperty]
public BankAccount BankAccountEdit { get; set; }
Один используется для вставки нового BankAccount, а другой - для редактирования существующих, нажав кнопку в таблице.