ModelState 两次包含字符串必需属性

ModelState Contains String Required Properties Twice

我正在使用 Razor 开发 Asp.Net Core 2.1 应用程序 Pages.I 遇到一个奇怪的 behavior.The 问题是当我提交表单时,客户端验证通过填写了所有必需的属性,但随后验证失败并显示 ModelState.IsValid 检查,原因是 ModelState 两次包含所需的字符串属性,一次是输入的值,一次是空值,所以验证失败!

{[BankName, Microsoft.AspNetCore.Mvc.ModelBinding.ModelStateDictionary+ModelStateNode]}

{[BankAccount.BankName, Microsoft.AspNetCore.Mvc.ModelBinding.ModelStateDictionary+ModelStateNode]}

请参阅,BankAccount 是模型 class,BankName 是必需的 property.I 不要知道为什么 属性 在 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();
    }

经过大量搜索后,我找到了一个解决方法,它不是很 ideal.That 来删除奇怪地插入到 ModelState 字典中的额外 属性。我的意思是这一行:

ModelState.Remove("BankName");

但这不对 way.I想弄清楚为什么会这样?!

这是在 PageModel 上定义的两个属性:

    [BindProperty]
    public BankAccount BankAccount { get; set; }
    [BindProperty]
    public BankAccount BankAccountEdit { get; set; }

一个用于插入新的 BankAccount,另一个用于通过单击 table 中的按钮来编辑现有 BankAccount。

我发现 issue.The 问题是我的页面模型中有两个相同类型的属性 (BankAccount class),一个用于插入新实体,另一个用于编辑现有实体都在同一页面上。 因此,为了分别验证每个表单的 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();
    }