我想要验证的表单上有一些文本框。我想确认它们只包含数字,并且“total”文本框等于其他框的总和:
Protected Sub TotalBoxValidator_ServerValidate(source As Object, args As System.Web.UI.WebControls.ServerValidateEventArgs) Handles TotalBoxValidator.ServerValidate
If ((Convert.ToInt32(Box1.Text) + Convert.ToInt32(Box2.Text) + Convert.ToInt32(Box3.Text) + Convert.ToInt32(Box4.Text) + Convert.ToInt32(Box5.Text) + Convert.ToInt32(Box6.Text) + Convert.ToInt32(Box7.Text)) = Convert.ToInt32(TotalBox.Text)) Then
args.IsValid = True
Else
args.IsValid = False
End If
End Sub
现在在测试期间,我只用整数填充框。总框会自动更新为其他框的总和。但是,当我单击表单上的“提交”按钮,并且所有验证程序都运行时,此程序无法正常运行。
代码在第一个if语句上抛出一个错误,表示Convert.ToInt32调用的输入无效。 “输入字符串的格式不正确”。我很肯定我将整数放在每个框中,并且我的TotalBox等于其他框的总和。所以我有点坚持为什么这会引发错误。 也许我正在从字符串转换为整数错误?
有谁知道这里发生了什么?
答案 0 :(得分:2)
我的问题与我的TotalBox(一个ASP.net TextBox控件)将其“Enabled”属性设置为false这一事实有关。我这样做是因为它使文本框变灰,用户无法更改文本框的值。由于TextBox未启用,因此无法在运行时访问TextBox的值。虽然我在页面的javascript中成功地更改了它的值,但是在视觉上文本框的值在页面上更新,尝试在后面的代码中使用它的值作为字符串导致错误。
它与代码的逻辑或任何语法错误无关。要解决此问题,我将TotalBox的Enabled属性设置为true。现在盒子不再灰显了,用户可以将它们的总数改为不同于盒子的总和,这不是我想要的,但是我再次在这里验证总数,所以它不是很重要。我会回去试着用javascript中的文本框变灰,因为我觉得这样可以保持获取TextBoxes值的能力,同时仍然让它变灰。
编辑:上述解决方案确实有效。对于遇到此问题的其他人,请考虑尝试使用javascript而不是任何.net或asp代码来淡化文本框。
以下是更新后的代码:
Protected Sub TotalBoxValidator_ServerValidate(source As Object, args As System.Web.UI.WebControls.ServerValidateEventArgs) Handles TotalBoxValidator.ServerValidate
Dim Box1Value = Convert.ToInt32(Box1.Text)
Dim Box2Value = Convert.ToInt32(Box2.Text)
Dim Box3Value = Convert.ToInt32(Box3.Text)
Dim Box4Value = Convert.ToInt32(Box4.Text)
Dim Box5Value = Convert.ToInt32(Box5.Text)
Dim Box6Value = Convert.ToInt32(Box6.Text)
Dim Box7Value = Convert.ToInt32(Box7.Text)
Dim TotalBoxValue = Convert.ToInt32(TotalBox.Text)
If (Box1Value + Box2Value + Box3Value + Box4Value + Box5Value + Box6Value + Box7Value = TotalBoxValue) Then
args.IsValid = True
Else
args.IsValid = False
End If
End Sub
现在,这是调试这种情况真正有用的东西。尝试将转换放在不同的行上,因为当程序停止时,它会准确显示哪个转换出错了。就我而言,我在TotalBoxValue行上出错了。所以我知道我的TotalBox出了问题。 TotalBox与其他任何文本框的不同之处是什么?嗯,首先,这是总数。但我知道这是正常的。那么我想到了它的属性。它的enabled属性设置为false,与其他框不同。所以我知道这必须改变。
由于某些原因,在asp.net中,当控件的Enabled属性设置为false时,您无法在运行时访问其任何属性。我注意到这可能不直观。
答案 1 :(得分:1)
我建议您在文本框中使用CompareValidators。
如果您的值不合适,这将确保页面甚至不会回发。示例标记:
<asp:CompareValidator ErrorMessage="errormessage" ControlToValidate="Box1"
runat="server" Type="Integer" />
然后你可以在技术上保留你已经发布的代码,但是如果你想放弃验证器这样的东西会将无效输入视为0:
Dim temp As Integer
Dim boxTotal = {box1.Text, _
box2.Text, _
box3.Text, _
box4.Text, _
box5.Text, _
box6.Text, _
box7.Text} _
.Select(Function(text) If(Integer.TryParse(text, temp), temp, 0)) _
.Sum()
Integer.TryParse(TotalBox.Text, temp)
args.IsValid = boxTotal = temp
答案 2 :(得分:0)
您正在尝试在知道文本值是否为整数之前将文本值转换为整数,请阅读
integer.TryParse
dim v1, v2, v3, v4, v5, v6, v7 as integer
if not integer.tryparse(box1.text, v1) then
args.IsValid = False
return
endif
if not integer.tryparse(box2.text, v2) then
args.IsValid = False
return
endif
......