清爽的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。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top