2008-11-30 89 views
2

我正在为一个类项目制作一个C#应用程序。我想确保一个字符串有三个值之一。通常,在Web应用程序中,我会在客户端使用JavaScript进行验证。但是,这是目前的控制台应用程序。我知道我应该尽早进行验证,但验证有什么好的经验规则?应用程序的最佳位置在哪里进行验证?经验法则?

回答

8

每个模块都应该进行自己的验证,并且永远不要相信调用代码给出的内容。这通常意味着验证应该发生在应用程序的每一层。您尤其不希望在客户端发生任何验证,因为这可能会导致安全漏洞。已知客户端上运行的代码会不时发生变化。

0

根据应用程序的进展情况,您可以在离开该页面/步骤之前进行验证(如果它像一个向导,可以逐步浏览多个页面/步骤),也可以在用户离开该文本框后立即生效/值。另一个选项是修改时的验证。

2

作为一个经验法则,如你所说,你应该尽可能早地验证,但在客户端 - 服务器应用程序,它尽快验证服务器上的数据,以防止可能出现的安全问题是非常重要的。

+0

正确...客户端的冗余验证可以避免验证往返,但服务器必须负责所有验证,以防止来自其他源的未验证命中。 – 2008-11-30 15:39:49

1

我喜欢在用户点击Ok或Next之后验证 - 在他们离开他们所在的屏幕之前。在修改过程中验证很少有效 - 用户必须能够退格,在输入字符串时插入字符串,并且复制/粘贴到字符串字段有它自己的问题。如果字符串显示为红色,直到它是有效的,这可能会有所帮助,但是您仍然必须防止继续进行,直到它得到纠正。同样,对于离开文本框,在进行数据输入时显示消息框可能会很刺激。等到用户说完成完成,并立即进行所有验证。

2

我认为你应该验证三次。

  1. 在客户端,2在服务器和3在数据库中的检查约束。

在控制台应用程序中,您可以立即验证,因为您知道用户将按什么顺序输入数据。

3

如果你正在做MVC,机会是你从地上爬起来使用TDD工作。

我不知道这是否是最好的方式,但我做事的方式是..

  • 让我的业务对象。
  • 定义某种验证框架,因此业务对象可以返回当前状态的错误列表并使用单元测试来测试这些错误。
  • 如果您使用LINQ to SQL中,实现分部方法的OnValidate(),并使它所以它要求你的mybusinessobject.geterrors()。 OnValidate在您执行db时会被调用。提交更改()以便您可以停止保存无效数据
  • 现在,在您的控制器中,当有人创建新的业务对象或编辑一个对象时,请使用从用户获得的任何数据创建对象 - 然后调用您的geterrors()方法,做任何
  • 然后客户端验证,如果你可以arsed

这是这里所描述斯科特·格思里的框架:http://weblogs.asp.net/scottgu/archive/2008/09/02/asp-net-mvc-preview-5-and-form-posting-scenarios.aspx

我喜欢它,它意味着你可以一次定义业务规则并在不同的层次上重复使用它们,这意味着它不太可能会错过它们当你更新东西时的一个特定区域

0

关于一般最佳实践有很多很好的答案......但是你的问题指定了“MVC”,并且只有一个正确的答案。

编辑:你的“问题”没有说MVC,但你的标签没有。

MVC =模型视图控制器

所有的业务逻辑是在控制器中。这是答案。

在这篇文章中的其他答案是伟大的提示,如“不信任客户端验证”......和“无处不在验证”。

0

另一个提示:如果您可以在元信息中定义您的验证规则,那么所有验证逻辑都可以解释的情况下,验证无处不在。然后,您只需要在一个地方定义规则,而不必担心客户端验证,服务器端验证和测试用例彼此不同步。

1

我喜欢Timothy's picking up on MVC

由于我们对应用程序的性质了解很少,所以我想指出一些非常一般的经验法则以及已经提供的良好建议。

验证的方式,

  1. 不可逆的动作与无效输入

  2. 执行的用户不会失去工作

  3. 用户的活动从来没有把的状态下错误的输入不容易识别并且简单地收回

  4. 应用程序w生病在一个糟糕的状态不是失败或崩溃

  5. 无(共同)持续的材料离开过(或见到)作为无效数据

  6. 一个用户的应用程序的处理结果是不是沮丧在完成其有用作为验证完成的方式和时间的结果

这应该是很好的掩盖它。

相关问题