首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C#在ASP.NET中使用自定义校验器的故障

C#在ASP.NET中使用自定义校验器的故障
EN

Stack Overflow用户
提问于 2014-11-26 19:33:05
回答 2查看 244关注 0票数 1

为此,我需要使用自定义验证器,而我必须解决的问题是:我必须验证以形式输入州缩写的人是有效的美国州缩写(如AK、AL、AR等)。我看不到任何语法错误,所以我的表单很好,但是当我输入无效状态(如ZZ)时,它不会给我应该自动发布的错误消息(在这个例子中,我的错误消息是“请输入一个有效的US状态(使用所有的大写))。下面是我的控制:

代码语言:javascript
复制
     <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" />

我的事件的逻辑是:

代码语言:javascript
复制
    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>

不太确定是什么问题,但我的其他验证器工作良好。它们只是简单的所需的验证器,但是如果您没有在文本框中输入任何内容,文本就会像预期的那样出现。任何帮助都将不胜感激。谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-11-26 19:47:02

for (int i = 0; i <= stateList.Count; i++)循环的这个逻辑是不正确的-它不停地切换args.IsValid的值而不退出,直到它完成循环(并且它超过了上限)。一旦找到有效的状态,就可以退出。

另外,如果验证方法stateArrayCheck在后面的代码中(.aspx.cs,而不是<script runat="server">标记),则需要确保验证方法至少是受保护的范围。

您还可以考虑将状态常量列表移到静态HashSet中--因为它是常量,因此不需要在每个验证调用上实例化它,并且像HashSets和字典这样的“键控”集非常适合快速、唯一的查找。

然后,您可以在一行中进行验证:

代码语言:javascript
复制
// 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);
}
票数 3
EN

Stack Overflow用户

发布于 2014-11-26 20:35:23

你们关系很好。正如StuartLC所说,您将再次将IsValid设置为false,即使您以前找到了匹配的。既然我假设您仍然在学习C#,那么现在就坚持您所得到的(并理解),然后按照如下方式进行调整:

代码语言:javascript
复制
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循环导出集合的边界。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27157460

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档