2014-03-02 19 views
0

我目前是一名学生完成了Visual Basic课程,我的教授坚持认为,如果用户输入需要一个整数,那么我将把所有按键字符都限制为数字/退格/删除。与字母表字符串相同:他希望我只根据程序的要求允许特定的字符,但要使用按键事件来完成。限制用户按键输入是否是一种很好的做法,如果不是,验证输入的最佳方法是什么?

我正在试图限制“名字”和“姓氏”字段只允许字母和退格键,并且正在研究最好的方式来做到这一点,当我遇到一个话题提到这是一个非常糟糕的主意。答复指出,验证应该在提交输入时/之后处理,而不是限制用户在输入时输入他们想要的内容的能力,即使它是错误的(并且我很抱歉,我会链接到了这个地方,但是我今天一直在为这么多的博客/线索等等倾注,现在它已经被掩埋并丢失了)。

无论如何,我认为它是有道理的,尽管我从他的推理中得到的东西只是简单地沿着“它真的让使用者感到沮丧,而且没有必要”。尽管如此,我花了几个小时真的在网上搜索,试图找到通过按键或文本更改事件以外的其他方法验证输入的最佳方法,但实际上并没有任何运气。

我想我的问题是,通过kepress/handled = true/etc等限制用户输入通常是一个不好的做法?如果是这样,为什么?在用户输入验证方面,我应该专注于获得更好的习惯吗?如果是这样,确保用户提交正确类型信息的最佳方法是什么?

我刚刚意识到,我常常根据教科书或特定教师的说法进入习惯,只是意识到这是不能提供最佳解决方案或过时的东西,等等。我真的很想当然,我会开始学习最好的编码习惯,而不是去学习坏习惯并解决它们。也许我正在深入研究一些非常简单的事情,但我希望从那些比我更有经验的人那里得到一些意见。

非常感谢您的时间!

+0

教授是完全错误的。 a)在按Enter/Ok/Done之前,可能没有任何问题b)违反旧Win UI准则(“用户负责”)的规则* 1 *。 c)Windows未设置按键级别验证。它**可以完成,但需要反复重复的代码太多d)还有其他方法专门用于此,ErrorProvider和Validate事件。 e)一个领域的有效值通常取决于另一个领域。他/她还希望你以特定的顺序执行输入(参见'b')。 – Plutonix

+0

谢谢,这是我正在寻找的解释类型。对我来说,允许用户进行控制似乎更好,而你的推理能帮助我理解为什么。感谢您为这项工作命名好的活动。我认为他没有提到任何特定顺序。 – Trillian

回答

2

TL; DR - 如果它是唯一的数据格式验证完成,这是不好的做法。如果输入与后端的数据验证相结合,对输入进行格式检查是很好的。

我想我的问题是,通过kepress限制用户输入/处理=真正的/ etc一般是不好的做法?如果是这样,为什么?

这是坏习惯,如果它是第一道也是唯一的防线。原因是你正在建立的这个系统是针对一家公司的,而且会在那里停留一段时间。现在,你的表单是唯一传递信息的东西,并且它正确地将输入数据限制为某种格式,并且一段时间以后,系统是好的。

现在说,这已经有一段时间了,你并没有真正记得这个系统(甚至没有继续,新员工正在使用这个系统)。公司需要通过其他方式(比如手机)向系统发送信息,以便他们编写一个应用程序,将用户输入发送到系统。不幸的是,他们不知道格式,系统以一种新的和无法预料的方式破裂。在这一点上,系统变得如此之大,没有人真正知道从哪里开始,调试这个问题会让每个人都花费很多钱和头痛,每次有人想要添加到系统中。因此,从根本上说,这个问题(这种问题始终都会发生)可以通过组合良好的文档和系统组件之间的正式通信方法来解决,包括在每个接口上放置一道防线。

当谈到用户输入验证时,我应该专注于获得更好的习惯吗?如果是这样,确保用户提交正确类型信息的最佳方法是什么?

当然!最好的方法是建立这样的系统(建立一些你喜欢的乐趣),一种方法是想象用户是恶意的,并且想破坏你的系统,因为教授会尽可能给他钱。设法保护系统免受恶意(或更可能的,无知的)用户的侵害。

编辑: 我没有深入研究一个最大的原因:带表单验证的网站可以通过发送自己的POST消息和任何你想要的数据完全绕过。这意味着Web表单验证只是一种便利措施,而不是一种安全措施。

+0

你好!感谢您提供非常详尽和详细的回复。对不起,如果我不太清楚我的问题,但我目前的问题涉及VB.NET和制作Visual Basic应用程序。限制输入和验证其他方式的相同概念是否适用于基于Web的表单? – Trillian

+0

@Trillian是的,对于大多数系统(网络表单或不是)而言,这是一个类似的概念,限制前端输入可能会带来错误的安全感。前端限制/验证几乎总是仅用于向用户提供反馈(所以它不应该是突兀的,也许为了这个任务的目的,它是教你而不是模仿现实世界的解决方案),后端服务器需要处理总是传递的数据的验证。 – Sam

+0

感谢您的明确表达,这非常有意义。 – Trillian

0

不,永远不会限制用户输入。如果需要,在该字段旁边放置一个X标记,用户可以悬停以查看错误消息(如果有错误)。服务器端表单验证应该在提交时发生,无论你如何处理剩下的事情。

+0

嗨,对不起,如果它不明确,但我的问题是关于Visual Basic/VB.NET而不是基于Web的应用程序或表单。你的建议也适用于VB.NET应用程序吗? – Trillian

+0

@Trillian:没关系。 Web和HTML5特别为用户体验设定了良好的标准。我看不出为什么不在winform中应用相同的原因 - 用户会爱上你。使用[ErrorProvider](http://msdn.microsoft.com/zh-cn/library/system.windows.forms.errorprovider(v = vs.110)。aspx)控制,或创建自己的。关于服务器端验证,您可以将其替换为业务逻辑层。您的winform不应该验证任何内容,而是将数据传递给业务逻辑,这将验证它并返回任何问题,然后将其报告给用户。 – Neolisk

+0

谢谢你清理那个! – Trillian

1

我对VB.NET也很新,所以有人无疑有更好的解决方案。这里是我的例子:

Imports System.Text.RegularExpressions 

    Public Class Form1 

     Private Sub btnValidate_Click(sender As Object, e As EventArgs) Handles btnValidate.Click 
      If Not Regex.Match(txtLettersOnly.Text, "^[a-z]*$", RegexOptions.IgnoreCase).Success Then 
       MessageBox.Show("Error! Enter alpha text only!", "Validation") 
      Else 
       MessageBox.Show("Success!", "Validation") 
      End If 
     End Sub 

    End Class 

这可以留作一个点击事件,或移动到一个Sub过程。

Imports System.Text.RegularExpressions 

    Public Class Form1 

     Private Sub btnValidate_Click(sender As Object, e As EventArgs) Handles   btnValidate.Click 
      validateTextBox() 
     End Sub 

     Private Sub validateTextBox() 
      If Not Regex.Match(txtLettersOnly.Text, "^[a-z]*$", RegexOptions.IgnoreCase).Success   Then 
       MessageBox.Show("Error! Enter alpha text only!", "Validation") 
      Else 
       MessageBox.Show("Success!", "Validation") 
      End If 
     End Sub 

    End Class 
相关问题