使用ASP.NET中的C#自定义验证器的问题

时间:2014-11-26 19:33:06

标签: c# asp.net

我需要为此作业使用自定义验证器,我必须解决的问题是:我必须验证某人在表单中输入州缩写是否是有效的美国州缩写(例如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>

不太确定问题是什么,但我的其他验证工作正常。它们只是简单的必需验证器,但如果您没有在文本框中输入任何内容,则文本会显示为它。任何帮助将非常感激。谢谢。

2 个答案:

答案 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循环来执行集合的边界。