ModelState содержит обязательные свойства строки дважды - PullRequest
0 голосов
/ 04 февраля 2019

Я занимаюсь разработкой приложения 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, а другой - для редактирования существующих, нажав кнопку в таблице.

1 Ответ

0 голосов
/ 05 февраля 2019

Я выяснил проблему. Проблема заключалась в том, что в моей модели страницы есть два свойства одного типа (класс BankAccount), одно для вставки новой сущности, а другое для редактирования существующей сущности на одной странице.Поэтому для проверки каждой формы отдельно OnPost () я использовал следующий код:

public async Task<IActionResult> OnPostAsync()
    {
        var validateBankAccount = ModelState.GetFieldValidationState("BankAccount");
        if (validateBankAccount == 
    Microsoft.AspNetCore.Mvc.ModelBinding.ModelValidationState.Invalid)
        {
            return RedirectToPage();
        }

        _context.BankAccounts.Add(BankAccount);
        await _context.SaveChangesAsync();

        return RedirectToPage();
    }
...