CompareValidator的间歇性错误 - ValueToCompare属性为“”

时间:2011-07-19 11:03:25

标签: asp.net vb.net validation

我有一个带有CompareValidator的页面:

<asp:textbox id="txtResponseDate" runat="server" />
<asp:requiredfieldvalidator id="rfvResponseDate" runat="server"
                        controltovalidate="txtResponseDate"
                        display="Dynamic"
                        errormessage="Date is required."
                        setfocusonerror="true">
                    </asp:requiredfieldvalidator>
<asp:comparevalidator id="cmvDate" runat="server"
                        controltovalidate="txtResponseDate"
                        display="Dynamic"
                        errormessage="Date must not be before today."
                        operator="GreaterThanEqual"
                        setfocusonerror="true"
                        type="Date">
                    </asp:comparevalidator>

在后面的代码中,我们设置了ValueToCompare属性,如下所示:

If Not IsPostBack Then

    cmvDate.ValueToCompare = DateTime.Now.ToString("d")   

End If

间歇性地(我们无法辨别模式),我们得到以下错误:

“'cmvDate'的ValueToCompare属性的值''无法转换为'Date'类型。”

使用以下调用堆栈:

at System.Web.UI.WebControls.CompareValidator.ControlPropertiesValid() 
at System.Web.UI.WebControls.BaseValidator.get_PropertiesValid() 
at System.Web.UI.WebControls.BaseValidator.Validate() 
at System.Web.UI.Page.Validate() 
at System.Web.UI.Page.Validate(String validationGroup) 
at System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument) 

我的第一个想法是日期格式奇怪,但我们使用的是英国日期,最后一次错误发生在7月18日,因此ValueToCompare设置为18/07/2011。我使用调试器手动设置它,它工作正常。任何人都有任何明智的想法,为什么会发生这种情况?

  1. 我已经检查了代码 - 没有其他地方可以设置它。
  2. 使用调试器,我在回发时进行了双重检查,并且正如预期的那样,保留了此属性值。

3 个答案:

答案 0 :(得分:5)

  

'cmvDate'的ValueToCompare属性的值''无法转换为'Date'类型。

此错误消息表示,在您的rangeValidator本身(不是您正在验证的控件)的验证属性ValueToCompare中,未设置。这可以是你写下这句话:

If Not IsPostBack Then
    cmvDate.ValueToCompare = DateTime.Now.ToString("d")   
End If

不在Page_Init事件中。

  1. 将设置ValueToCompare的代码移至Init event,同时删除对回发的检查。
  2. 检查数据检查期间此属性的值(可能是,您应该删除对Not IsPostBack的检查)。
  3. 在检查发生之前设置此属性。

答案 1 :(得分:2)

在您的控件设置中设置type="Date" whitch意味着您将值作为DateTime对象进行比较,但在ValueToCompare属性中设置string对象,而不是DateTime

如果您需要按字符串进行比较 - 将控制设置type设置为String, 如果您需要按日期进行比较 - 请将DateTime对象设置为ValueToCompare控件属性和Operator="DataTypeCheck"

答案 2 :(得分:1)

您是否收到任何其他与ViewState相关的错误?与“视图状态MAC验证失败一样。如果此应用程序由Web场或集群托管,请确保<machineKey>配置指定相同的validationKey和验证算法。不能在集群中使用AutoGenerate。

如果是这样,问题可能与此MS KB article: Intermittent Invalid Viewstate Error in ASP.NET Web pages中列出的内容之一有关。

  

有几种情况可能会导致此问题。每个已知条件都有简短的解释和可能的解决方法   应用程序池回收
  服务器场或服务器群集
  表格帖子
  代理服务器和病毒扫描程序

该文章中未提及的另一个可能的事情是连接速度缓慢或不可靠,从而导致用户不耐烦。我在美国托管的应用程序上工作,但很多用户来自印度。我们注意到印度用户中这类间歇性ViewState相关错误的频率要高得多。我们推测这可能是因为更长的延迟,更多的跳数,更低的带宽以及用户在页面加载完成之前与页面进行交互。