为此,我需要使用自定义验证器,而我必须解决的问题是:我必须验证以形式输入州缩写的人是有效的美国州缩写(如AK、AL、AR等)。我看不到任何语法错误,所以我的表单很好,但是当我输入无效状态(如ZZ)时,它不会给我应该自动发布的错误消息(在这个例子中,我的错误消息是“请输入一个有效的US状态(使用所有的大写))。下面是我的控制:
<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>不太确定是什么问题,但我的其他验证器工作良好。它们只是简单的所需的验证器,但是如果您没有在文本框中输入任何内容,文本就会像预期的那样出现。任何帮助都将不胜感激。谢谢。
发布于 2014-11-26 19:47:02
for (int i = 0; i <= stateList.Count; i++)循环的这个逻辑是不正确的-它不停地切换args.IsValid的值而不退出,直到它完成循环(并且它超过了上限)。一旦找到有效的状态,就可以退出。
另外,如果验证方法stateArrayCheck在后面的代码中(.aspx.cs,而不是<script runat="server">标记),则需要确保验证方法至少是受保护的范围。
您还可以考虑将状态常量列表移到静态HashSet中--因为它是常量,因此不需要在每个验证调用上实例化它,并且像HashSets和字典这样的“键控”集非常适合快速、唯一的查找。
然后,您可以在一行中进行验证:
// 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);
}发布于 2014-11-26 20:35:23
你们关系很好。正如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循环导出集合的边界。
https://stackoverflow.com/questions/27157460
复制相似问题