我正在使用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,另一个用于通过单击表中的按钮来编辑现有的。
答案 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();
}