刷新ModelState除去的错误
-
06-07-2019 - |
题
清爽的ModelState
嗨,我有一个问题有关的ModelState在ASP.NET 视控制器。
当用户选择一个特定选择从来看,开始日期和结束日期"认证"将基于其他日期进入。
这个问题是认证的日期回来作为空和我们的CertificationMetaData类specifys领域作为[需要]使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();
}
也正如你可以看看我写死的ID认证的类型。什么是最好的方法来比较价值查表的价值观?是一个枚举,最好的方式去?
感谢
解决方案
显然这是个人的事情,但我不会删除错误消息。
如果我要使用简单的解决方案,那么我将删除[Required]属性并向控制器添加验证代码,以便在缺少日期时添加错误,或者如果它是正确的类型则将其设置为备用值。
如果我想采用更复杂的解决方案,我会将验证放在模型级别。可能是模型必须实现的基类或接口。 ValidationHelper类,带有静态Validate(IValidate对象)方法,该方法将检查ValidationAttributes并在Model上调用Validate方法。然后它将返回ValidationErrors的集合。然后编写一个定制的ModelBinder来理解模型验证并将它们映射到ModelState错误。
其他提示
以下的方法刷新型状态,并可以让你保持你的模型设计符合[需要]属性等。
在我的情况下,我想我的模式到具有所需领域,正常级别的用户使用不能改变,因此我做了这样的:
ModelState.Remove("ChangeDate");
ModelState.Add("ChangeDate", new ModelState());
ModelState.SetModelValue("ChangeDate", new ValueProviderResult(club.ChangeDate, DateTime.Now.ToString(), null));
这样,你不需要去除你需要的领域,并且你也不需要提供的一个日期javascript。