15

刷新模型状态

嗨,我有一个关于 ASP.NET MVC 控制器中的 ModelState 的问题。

当用户从视图中选择某个选项时,“认证”的开始日期和结束日期将基于输入的其他日期来设置。

问题是认证日期返回为空,并且我们的 CertificationMetaData 类将字段指定为 [Required],因此一旦加载操作,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 值。将值与查找表值进行比较的最佳方法是什么?枚举是最好的方法吗?

谢谢

4

2 回答 2

38

以下方法刷新模型状态并允许您使模型设计与 [必需] 属性等保持一致。

就我而言,我希望我的模型具有使用 API 的普通级别用户无法更改的必填字段,所以我这样做了:

ModelState.Remove("ChangeDate");
ModelState.Add("ChangeDate", new ModelState());
ModelState.SetModelValue("ChangeDate", new ValueProviderResult(club.ChangeDate, DateTime.Now.ToString(), null));

这样您就不需要删除必填字段,也不需要在 javascript 中提供日期。

于 2012-03-14T23:45:36.107 回答
9

显然这是个人的事情,但我不会删除错误消息。

如果我要使用简单的解决方案,那么我将删除 [Required] 属性并向控制器添加验证代码,以在日期丢失时添加错误,或者如果日期正确,则将它们设置为备用值。

如果我要寻求更复杂的解决方案,我会将验证放在模型级别。可能是模型必须实现的基类或接口。具有静态 Validate(IValidate 对象) 方法的 ValidationHelper 类,该方法将检查 ValidationAttributes 并在模型上调用 Validate 方法。然后它将返回 ValidationErrors 的集合。然后将编写一个自定义 ModelBinder 来理解模型验证并将这些映射到 ModelState 错误。

于 2009-10-23T20:48:28.383 回答