【问题标题】:ModelState Contains String Required Properties TwiceModelState 包含两次 String 必需的属性
【发布时间】:2023-04-01 11:11:01
【问题描述】:

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

{[银行名称,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,另一个用于通过单击表中的按钮来编辑现有的。

【问题讨论】:

  • 向我们展示您的验证是如何设置的。
  • 当我在页面顶部有 BankAccounts 列表,在表格下方有 Create 表单时,就会发生这种奇怪的行为。事实上,Create 和 Edit 页面都放在一个页面上。如果我有单独的 Create 页面,一切都按预期工作,这意味着 ModelState 不会包含具有 null 值的附加属性。
  • 您的BankAccount 类是否被另一个模型引用并经过验证?
  • 对,看下面的代码:
  • @Amy 这是剃刀页面,OP 很可能在 PageModel 上有一个成员标记为 [BindProperty] 属性。

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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-18
    • 1970-01-01
    • 2017-04-22
    • 2012-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多