1

经过一年左右的MVC经验,我仍然对一件事感到困惑:如何有效地将ModelAnnotations与ModelState.IsValid一起使用?对于简单的教程示例,这一切都很好,我对此毫无疑问。但是,我认为有以下型号:MVC模型绑定/验证

Public Class Movie 

    Public Property MovieID As Integer 
    Public Property Title As String 
    Public Property Year As Integer 
    Public Property AddedByUser As String 

End Class 

现在场AddedByUser需要在数据库中,但是我不希望用户提供这个,而是基于在当前登录用户的业务逻辑。我如何使用这种情况下的DataAnnotation属性?如果我要求这个字段,然后在控制器,当我说:

Public Function SaveMovie(ByVal entity as Movie) As ActionResult 
    If ModelState.IsValid 
     // Save to DB here... 
    End If 
    Return View(entity) 
End Function 

...验证将失败,因为我没有视图绑定中的该字段。我应该有一个隐藏的领域吗?我应该为SaveMovie操作编写自定义视图模型吗?我想我可以在业务逻辑中编写自己的验证,但为什么要使用模型验证呢?自定义模型粘结剂也许?处理这些类型场景的最佳方式是什么?

只是为了给出另一个示例场景,插入和更新操作与验证之间的区别如何?对于更新操作,对象的主键是必需的。但是插入不是这种情况。你是否应该为这个关键属性插入和更新单独的模型?

回答

1

所以我处理这个的方式是我使用基于DataAnnotation的验证用户输入类型的东西。即对电子邮件地址,日期,必填字段等进行验证。您需要快速进行“完整性检查”并需要仔细检查用户条目。

我不会在我的数据库控件或我的代码控制的字段上放置任何DataAnnotations,即主键,您的[AddedByUser]属性作为用户不直接访问这些属性,因此您不应该对此添加验证检查。由于你的代码是唯一更新这些属性的东西,为什么要验证它们呢?

对于更多的“业务规则”类型验证我在我的模型上实现了IValidatableObject,该模型在所有属性级验证成功后都在MVC中运行。请注意,如果属性级验证失败,它将不会运行。这是有道理的,因为如果数据是'脏',你不想继续运行更复杂的验证等。

希望这会有所帮助:)