【问题标题】:Refresh ModelState to remove errors刷新 ModelState 以消除错误
【发布时间】:2010-12-09 11:24:04
【问题描述】:

刷新模型状态

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

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

问题在于认证日期返回为 null,而我们的 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 值。将值与查找表值进行比较的最佳方法是什么?枚举是最好的方法吗?

谢谢

【问题讨论】:

    标签: c# asp.net-mvc modelstate


    【解决方案1】:

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

    在我的例子中,我希望我的模型有一个使用 API 的普通用户无法更改的必填字段,所以我这样做了:

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

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

    【讨论】:

    • 感谢您解释如何实际消除错误。保持干净的代码很好,但重构时并不总是有选择。
    • 同意,我相信这更像是一个答案,因为它解决了这个问题。投票赞成。
    【解决方案2】:

    显然这是个人问题,但我不会删除错误消息。

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

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

    【讨论】: