ASP.NET MVC中的模型验证有哪些最佳实践?

时间:2009-09-16 23:19:17

标签: asp.net-mvc unit-testing validation model business-logic

我对有关客户端验证或模型绑定的答案不感兴趣。实际上,这个问题可能适用于MVC之外的任何数据访问类库,但我认为问题类似。

我正在使用目前的Repository模式与我的实体(模型)进行数据访问。目前,存储库处理所有CRUD操作,但我想我希望我的模型负责保存自己以进行验证。我该怎么办呢?

我可以在我的模型中添加一个IsValid方法,存储库可以调用该方法然后可以在存储库保存模型之前运行我的所有业务逻辑,但是没有任何FORCES存储库可以调用此验证逻辑,对吗?

如果我希望模型有一个Save方法,那么他们保存自己的正确方法是什么?他们不应该回到存储库吗?

有关我应该如何处理的任何想法?

谢谢!

1 个答案:

答案 0 :(得分:2)

允许模型验证保存操作没有任何内在错误;甚至可以返回false或抛出异常。当您必须向用户提供关于他们输入的数据无效的原因的反馈时,就会出现困难。

验证可以并且应该首先在视图中进行。这可以使用jQuery库在客户端轻松完成。但是,在用户提交之后,数据仍必须在服务器端验证,如果数据仍然存在问题,您仍必须向用户提供解释。

由于需要提供用户反馈,因此可以在 View Model 对象中有效地提供此类服务器端验证。此数据对象有两个用途:首先,它封装在强类型对象中在视图和控制器之间传递的数据。其次,它提供了一个方便的位置来执行验证,而无需在控制器或视图中使用验证逻辑。

如果使用Linq to SQL,则视图模型可以是实际数据模型类的扩展,使用C#中的partial关键字。这允许您使用生成的Linq to SQL类的现有ORM功能,同时增加其他验证功能。我假设这在实体框架和其他ORM中的工作方式相同。

在NerdDinner教程中描述了视图模型: http://nerddinnerbook.s3.amazonaws.com/Part6.htm

此处描述验证过程:
http://nerddinnerbook.s3.amazonaws.com/Part3.htm