我需要为此作业使用自定义验证器,我必须解决的问题是:我必须验证某人在表单中输入州缩写是否是有效的美国州缩写(例如AK,AL,AR)等)。我没有看到任何语法错误,因此我的表单发布正常,但是当我输入无效状态(例如ZZ)时,它不会给我自动发布的错误消息(在此实例中) ,我的错误信息说“请输入有效的美国州(使用全部上限)。)。这是我的控制:
<asp:Label
id="state"
text="State:"
runat="server" />
<br />
<asp:TextBox
id="valState"
MaxLength="2"
Width="20"
Runat="server" />
<asp:CustomValidator
id="reqState"
ControlToValidate="valState"
OnServerValidate="stateArrayCheck"
Text="Please enter a valid U.S. State (using all caps)"
Runat="server" />
<br /><br />
<asp:Button
id="btnSubmit"
Text="Submit"
Runat="server" />
我的活动的逻辑在这里:
void stateArrayCheck (Object source, ServerValidateEventArgs args)
{
ArrayList stateList = new ArrayList();
stateList.Add("AL");
stateList.Add("AK");
stateList.Add("AR");
stateList.Add("AZ");
stateList.Add("CA");
stateList.Add("CO");
stateList.Add("AL");
stateList.Add("CT");
stateList.Add("DE");
stateList.Add("FL");
stateList.Add("GA");
stateList.Add("HI");
stateList.Add("ID");
stateList.Add("IL");
stateList.Add("IN");
stateList.Add("IA");
stateList.Add("KS");
stateList.Add("KY");
stateList.Add("LA");
stateList.Add("ME");
stateList.Add("MD");
stateList.Add("MA");
stateList.Add("MI");
stateList.Add("MN");
stateList.Add("MO");
stateList.Add("MS");
stateList.Add("MT");
stateList.Add("NC");
stateList.Add("NE");
stateList.Add("NH");
stateList.Add("NJ");
stateList.Add("NM");
stateList.Add("NY");
stateList.Add("ND");
stateList.Add("OH");
stateList.Add("OK");
stateList.Add("OR");
stateList.Add("PA");
stateList.Add("RI");
stateList.Add("SC");
stateList.Add("SD");
stateList.Add("TN");
stateList.Add("TX");
stateList.Add("UT");
stateList.Add("VA");
stateList.Add("VT");
stateList.Add("NM");
stateList.Add("WA");
stateList.Add("WY");
for(int i=0; i <= stateList.Count; i++)
{
if (valState.Text != stateList[i])
args.IsValid = false;
else
args.IsValid = true;
}
}
</script>
不太确定问题是什么,但我的其他验证工作正常。它们只是简单的必需验证器,但如果您没有在文本框中输入任何内容,则文本会显示为它。任何帮助将非常感激。谢谢。
答案 0 :(得分:3)
for (int i = 0; i <= stateList.Count; i++)
循环的这个逻辑是不正确的 - 它一直切换args.IsValid
的值而不退出,直到它完成循环(并且它超出上限)。您可以在找到有效状态后立即退出。
此外,如果验证方法stateArrayCheck
位于后面的代码中(.aspx.cs
,而不是<script runat="server">
标记),则您需要确保验证方法至少是受保护的范围。
您还可以考虑将状态常量列表移动到静态HashSet
中 - 因为它是常量,所以不需要在每次验证调用时实例化它,并且键入&#39;像HashSets和Dictionaries这样的集合非常适合快速,独特的查找。
然后,您可以在一行中进行验证:
// Move the state list to a static / cached initialization
private static HashSet<string> StateList = new HashSet<string>
{
"AL","AK", ...
};
// The check for valid state is now a simple lookup in the HashSet
protected void stateArrayCheck(Object source, ServerValidateEventArgs args)
{
args.IsValid = StateList.Contains(valState.Text);
}
答案 1 :(得分:1)
你很亲密。正如StuartLC所说,即使您之前找到了匹配项,也会再次将IsValid
设置为false
。既然我认为你还在学习C#,那就坚持你现在所拥有的(并理解),并且这样适应:
ArrayList stateList = new ArrayList();
stateList.Add("AL");
/* your entire list here */
stateList.Add("WY");
// expect to not find the state
args.IsValid = false;
// check if you can find the state in your list
foreach (string state in stateList)
{
if (valState.Text == state){
args.IsValid = true;
break; // no point in checking further elements, break the loop
}
}
foreach
循环而不是for
循环只是个人偏好。但是,您无法使用foreach
循环来执行集合的边界。