我的控制器代码如下:
[HttpPost]
public ActionResult Create(ExampleViewModel model)
{
model.User.RegistrationNumber = this.RegistrationNumber;
if (ModelState.IsValid)
{
}
return View("Create", model);
}
我一直收到验证错误消息,说"Registration Number cannot be blank"
但我明确地设置了它。
我是否必须重置ModelState
,因为我以某种方式修改了模型?
基本上我发生了什么事情我将文本框设置为禁用,然后在表单发布期间数据丢失,所以我必须再次明确地设置它。
答案 0 :(得分:3)
由于您将文本框设置为已禁用,因此未发布数据。
当您自己设置值时,您可以通过执行以下操作来删除该字段上的错误:
ModelState.Remove("User.RegistrationNumber");
在调用ModelState.IsValid
之前。
答案 1 :(得分:0)
当控制器中设置注册号的代码行时,ModelState验证已经发生。它发生在调用控制器上的Create()方法之前。很难从你的描述中知道你究竟想要实现什么,但是如果你不希望该字段得到验证,你可以通过注释掉[required]属性来关闭该字段的验证。
答案 2 :(得分:0)
在您致电IsValid
之前进行验证,错误将出现在字典中。
我不确定这是否是处理它的最佳方法,但我一直在做这样的事情:
[HttpPost]
public ActionResult Create(ExampleViewModel model)
{
if (ModelState["User.RegistrationNumber"].Errors.Count == 1) {
model.User.RegistrationNumber = this.RegistrationNumber;
ModelState["User.RegistrationNumber"].Errors.Clear();
}
}
答案 3 :(得分:0)
此处的其他解决方案无法在.NET Core 3.1中按预期方式工作,因此我使用了以下替代方法,该替代方法显式地仅设置所需模型属性的Validation状态。
if (ModelState["Property"].Errors.Count > 0)
{
model.Property = someRequiredProperty; // db query using FirstOrDefault()
if (model.Property != null)
{
ModelState["Property"].ValidationState = ModelValidationState.Valid;
}
}
if (ModelState.IsValid)
{
// ...
}