集合中的模型验证 - 导致ModelState无效

时间:2017-04-12 16:14:36

标签: c# asp.net-mvc

MVC 5 app ....

我有一个包含许多字段的模型......其中2个是......(这是模型。)

public string eventStatus {get; set;}
public DateTime? eventDateStarted {get; set;}
public DateTime? eventDateCompleted {get; set;}

我想要做的是永远不要将eventStatus设置为"已关闭"除非eventDateStarted和eventDateCompleted字段不为null。如果是,则导致无效的ModelState。

请注意:此处涉及编程逻辑,可根据业务规则获得更高级的编程逻辑。所以,这不仅仅是说这个字段是必需的,以便设置这个等等......

我认为放置此逻辑的最佳位置是eventStatus的set方法。这是最佳实践解决方案吗?如果是这样,我如何强制ModelState无效?

这是我到目前为止所写的......

    [Display(Name = "Status")]
    public string eventStatus
    {
        set
        {
            if (EventActualEnd is null || EventActualStart is null)
            {
                ModelState.AddModelError("Status", "Start and End date is mandatory");
            } 
        }
    }

但是,它并不像AddModelError。

1 个答案:

答案 0 :(得分:1)

我不确定AuditStatusId的代码在哪里,但它看起来属于我的模型。 ModelState是控制器的属性,只能从继承自System.Web.Mvc.Controller的类访问。

外部库是否适合您?如果是这样,我会查看可通过NuGet获得的MVC Foolproof。它允许复杂的模型数据注释,这些注释可以完全满足您的需求。您可以根据许多不同的情况设置自定义验证并创建自己的验证。

如果这不可能,默认情况下,MVC在模型上的内置数据注释中受到限制,以进行验证。您必须使用自己的扩展,或者在通常检查服务器端的ModelState.IsValid的控制器逻辑中,添加您自己的逻辑以检查当前模型变量并继续或突破逻辑路径,基本上手动执行ModelState.IsValid。使用这样的检查不是很复杂,它应该是非常少的代码,如果你需要在多个地方执行它,你可以将它分解为实用程序类并传入模型,在那里进行验证,然后返回验证的真假。同样,这只是服务器端,如果您希望根据应用程序的构建方式进行客户端验证,则需要在客户端执行类似的魔术。