MVC模型绑定/验证

时间:2012-05-09 21:32:28

标签: asp.net-mvc model-view-controller validation data-annotations model-binding

经过一年左右的MVC经验,我仍然对一件事情感到困惑:如何有效地将DataAnnotations与ModelState.IsValid一起使用?对于简单的教程示例,这一切都很好,我对此没有任何疑问。但我猜我有以下模型:

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 个答案:

答案 0 :(得分:1)

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

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

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

希望这会有所帮助:)