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

时间:2019-02-04 16:17:49

标签: c# asp.net-core razor-pages

我正在使用Razor Pages开发Asp.Net Core 2.1 App。我的行为很奇怪。问题是当我提交表单时,客户端验证通过了所有必填属性,但是然后验证失败,并通过ModelState.IsValid检查,原因是ModelState包含两次必需的字符串属性,一个包含输入的值,另一个包含空值,所以验证失败!

  

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

     

{[ BankAccount.BankName ,Microsoft.AspNetCore.Mvc.ModelBinding.ModelStateDictionary + 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 :(得分:0)

我解决了这个问题。问题是我的页面模型中有两个相同类型的属性(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();
    }