Her*_*eep 14 c# asp.net-mvc modelstate
嗨,我对ASP.NET MVC控制器中的ModelState有疑问.
当用户从视图中选择某个选项时,将根据输入的其他日期设置"认证"的开始日期和结束日期.
这个问题是认证日期返回为null,我们的CertificationMetaData类将字段指定为[必需],因此一旦操作加载,ModelState就无效.
手动删除ModelSate错误允许这个工作,但我想知道是否有更好的方法来做到这一点?有没有办法刷新ModelState?我应该不要求这些字段吗?或者我应该使用javascript从视图中添加日期值?
public ActionResult Create(FormCollection fc, Certification certification, Absence absence)
{
if (certification.CertificationTypeID == 1)
{
certification.CertificationStartDate = absence.StartDate;
certification.CertificationEndDate = absence.StartDate.AddDays(7);
this.ModelState.Remove("CertificationStartDate");
this.ModelState.Remove("CertificationEndDate");
}
if (this.ModelState.IsValid)
{
// save
return RedirectToAction("Index");
}
return View();
}
Run Code Online (Sandbox Code Playgroud)
另外,您可以看到我已经对证书类型的ID值进行了硬编码.将值与查找表值进行比较的最佳方法是什么?enum是最好的方式吗?
谢谢
Ewa*_*cas 33
以下方法刷新模型状态,并允许您使模型设计与[required]属性等保持一致.
在我的情况下,我希望我的模型有一个必需的字段,正常级别的用户使用API不能更改,所以我这样做:
ModelState.Remove("ChangeDate");
ModelState.Add("ChangeDate", new ModelState());
ModelState.SetModelValue("ChangeDate", new ValueProviderResult(club.ChangeDate, DateTime.Now.ToString(), null));
Run Code Online (Sandbox Code Playgroud)
这样您就不需要删除必填字段,也不需要在javascript中提供日期.
显然这是个人的事情,但我不会删除错误消息.
如果我要使用简单的解决方案,那么我将删除[Required]属性并向控制器添加验证代码,以便在缺少日期时添加错误,或者如果它是正确的类型则将它们设置为备用值.
如果我想要更复杂的解决方案,我会将验证放在模型级别.可能是模型必须实现的基类或接口.ValidationHelper类,带有静态Validate(IValidate对象)方法,该方法将检查ValidationAttributes并在Model上调用Validate方法.然后它将返回ValidationErrors的集合.然后编写一个定制的ModelBinder,它理解模型验证并将这些映射到ModelState错误.
| 归档时间: |
|
| 查看次数: |
19382 次 |
| 最近记录: |