【发布时间】: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