1

经过一年左右的 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

现在数据库中需要字段 AdditionalByUser 但是我不希望用户提供这个,而是基于当前登录用户的业务逻辑。在这种情况下,我将如何使用 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 操作编写自定义视图模型吗?我想我可以在业务逻辑中编写自己的验证,但是为什么要使用模型验证呢?自定义模型粘合剂也许?处理这些类型的场景的最佳方法是什么?

再举一个示例场景,插入和更新操作与验证之间的区别是什么?对于更新操作,需要对象的主键。但是,插入的情况并非如此。您是否应该仅仅因为这一关键属性而具有用于插入和更新的单独模型?

4

1 回答 1

1

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

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

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

希望这可以帮助 :)

于 2012-07-14T12:17:34.837 回答