在asp.net中执行sql之前验证日期

时间:2009-09-01 11:03:46

标签: .net asp.net validation

我有一个以典型方式绑定到数据源的数据网格(简化为简洁):

<asp:SqlDataSource ID="ds" runat="server" ConnectionString="xxx"
     ProviderName="yyy" SelectCommand="SELECT "a from A where date > ?">
    <SelectParameters>
        <asp:ControlParameter ControlID="txtDateFrom" Name="fromDate" PropertyName="Value" Type="DateTime"/>
    </SelectParameters>

...

我在txtDateFrom

上也有自定义验证器
<asp:CustomValidator ID="fromDateCorrectVal" runat="server" ControlToValidate="txtDateFrom"  ErrorMessage="From date is not valid" OnServerValidate="fromDateCorrectVal_ServerValidate" Display="None"/>

后面的代码类似于:

protected void fromDateCorrectVal_ServerValidate(object source, ServerValidateEventArgs args)
{
    DateTime parsedDate;
    if (!DateTime.TryParse(tryDate, out parsedDate))
    {
            args.IsValid = false;
            fromDateCorrectVal.ErrorMessage = "Invalid from date";
    }

}

但这似乎不起作用!如果我在日期字段中输入垃圾,我会收到一个ASP错误 - 解析无效的日期令牌。

如果验证失败,如何阻止SQL尝试触发? (我怀疑我需要在某个时候检查页面isValid,但我在datasource_Selecting事件中尝试这个的努力似乎不起作用)

提前感谢您提供任何帮助

赖安

2 个答案:

答案 0 :(得分:2)

您可以使用SqlDataSource.Selecting事件处理此问题,然后调用取消。

  

通过添加事件处理程序委托   处理选择事件,你可以   执行任何其他预处理   必需或取消数据库查询   完全。因为   SqlDataSourceSelectingEventArgs类   源于   SqlDataSourceCommandEventArgs类,   你可以取消待定   SqlDataSource数据库查询   将Cancel属性设置为true。   你可以检查和操纵   CommandText,参数集合,   和其他数据库查询属性   在运行查询之前   访问DbCommand对象   由Command属性公开。您   也可以考察一下   DataSourceSelectArguments对象   传递给Select方法   访问Arguments属性。

http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.sqldatasourceselectingeventargs.aspx

答案 1 :(得分:0)

另一种方法是使用CompareValidator:

<asp:CompareValidator id="dateValidator" runat="server" Type="Date" Operator="DataTypeCheck" ControlToValidate="txtDateFrom" ErrorMessage="Error!" />

此验证程序具有内置的日期验证操作,并且在所有验证通过之前不允许页面继续处理。