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();
}
我正在使用 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();
}