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

ASP.NET中使用C#的自定义验证器出现问题,c#,asp.net,C#,Asp.net,我需要为这个任务使用一个自定义验证器,我必须解决的问题是:我必须验证在表单中输入州缩写的人是否是有效的美国州缩写(如AK、AL、AR等)。我没有看到任何语法错误,因此我的表单可以正常发布,但当我输入无效状态(如ZZ)时,它不会给我应该自动发布的错误消息(在本例中,我的错误消息是“请输入有效的美国状态(使用所有大写))。我的控件如下: <asp:Label id="state" text="State:" runat="server" /> <br />

我需要为这个任务使用一个自定义验证器,我必须解决的问题是:我必须验证在表单中输入州缩写的人是否是有效的美国州缩写(如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>
void stateArrayCheck(对象源,ServerValidateEventArgs参数)
{
ArrayList stateList=新的ArrayList();
州列表。添加(“AL”);
州列表。添加(“AK”);
国家清单。添加(“AR”);
州列表。添加(“AZ”);
州列表。添加(“CA”);
国家名单。添加(“公司”);
州列表。添加(“AL”);
州列表。添加(“CT”);
州列表。添加(“DE”);
州列表。添加(“FL”);
州列表。添加(“GA”);
状态列表。添加(“HI”);
状态列表。添加(“ID”);
州列表。添加(“IL”);
州列表。添加(“IN”);
州列表。添加(“IA”);
州列表。添加(“KS”);
州列表。添加(“KY”);
州列表。添加(“LA”);
州列表。添加(“我”);
州列表。添加(“MD”);
州列表。添加(“MA”);
州列表。添加(“MI”);
州列表。添加(“MN”);
州列表。添加(“MO”);
州列表。添加(“MS”);
州列表。添加(“MT”);
州列表。添加(“NC”);
州列表。添加(“NE”);
州列表。添加(“NH”);
州列表。添加(“NJ”);
州列表。添加(“NM”);
州列表。添加(“纽约”);
州列表。添加(“ND”);
州列表。添加(“OH”);
状态列表。添加(“确定”);
州列表。添加(“或”);
州列表。添加(“PA”);
州列表。添加(“RI”);
州列表。添加(“SC”);
州列表。添加(“SD”);
州列表。添加(“TN”);
州列表。添加(“TX”);
州列表。添加(“UT”);
州列表。添加(“VA”);
州列表。添加(“VT”);
州列表。添加(“NM”);
州列表。添加(“WA”);
州列表。添加(“WY”);

对于(int i=0;i这个
的逻辑对于(int i=0;i这个
的逻辑对于(int i=0;i你很接近。正如斯图尔特说的,你会再次将
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
循环超出集合的界限。

你很接近了。正如斯图尔特克所说,你将再次将
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
循环超出集合的界限。

为什么不使用下拉列表呢?如果这是一个真实世界的网站,我可能会这样做。但这是针对schol的,我们正在学习验证控制ols,所以我必须使用一个。为什么不使用下拉列表呢?如果这是一个真实世界的网站,我可能会这样做。但这是为schol设计的,我们正在学习验证控制,所以我必须使用一个。