【问题标题】:'CompareEndTodayValidator' cannot be converted to type 'Date'.?'CompareEndTodayValidator' 不能转换为 'Date' 类型。?
【发布时间】:2013-09-27 05:28:35
【问题描述】:

我有一个日历控制,选择日期时,它应该显示在“DD-mm-yyyy”格式的关联文本框上。并且有一个比较验证器,它应该验证所选日期,如果它大于今天的日期。我是这样写的

<asp:TextBox runat="server" ID="tb_date" BackColor="White" ></asp:TextBox>
     <asp:Calendar ID="EndDate" runat="server" 
                   OnSelectionChanged="EndDate_OnSelectionChanged" 
       </asp:Calendar>
            <asp:CompareValidator runat="server" ID="CompareEndTodayValidator" ErrorMessage="Exam date can't be less than today" 
ControlToValidate="tb_date"   Type="Date" Operator="LessThanEqual" >                </asp:CompareValidator> 


 protected void Page_Load(object sender, EventArgs e)
{ 
 CompareEndTodayValidator.ValueToCompare = DateTime.Now.ToString("dd-MM-yyyy");
}

   protected void EndDate_OnSelectionChanged(object sender, EventArgs e) //COMPARE VALIDATOR FOR EXAM DATE
{

    tb_date.Text = EndDate.SelectedDate.ToString("dd-MM-yyyy");
 }

显示错误

ValueToCompare 属性的值“26-09-2013” “CompareEndTodayValidator”无法转换为“日期”类型。

请帮忙。我已经通过更改 type="string" 进行了尝试。但失败了。当放置 mm-dd-yyyy frmat 时它可以正常工作。但我需要 dd-mm-yyyy 格式

【问题讨论】:

    标签: c# asp.net c#-4.0 date


    【解决方案1】:

    问题是您将所选日历值转换为的日期格式与默认的DateTime.Parse 不兼容,这无疑是比较器验证器在内部使用的。使用不同的日期格式或使用CustomValidator 控件,以便您可以手动控制日期解析格式。

    DateTime date = DateTime.Parse("26-09-2013"); // Fails
    

    我希望这会有所帮助。

    编辑 - 使用自定义验证器

    <asp:CustomValidator runat="server" ID="CompareEndTodayValidatorCust" OnServerValidate="ServerValidation" ControlToValidate="tb_date" ValidateEmptyText="True" ErrorMessage="Exam date can't be less than today" />
    
    protected void ServerValidation (object source, ServerValidateEventArgs arguments)
    {
        System.Globalization.CultureInfo provider = System.Globalization.CultureInfo.InvariantCulture;
        string format = "dd-MM-yyyy";
        DateTime dtToValidate = DateTime.ParseExact(tb_date.Text, format, provider);
    
         arguments.IsValid = (dtToValidate <= DateTime.Now.AddDays(-1));
    }
    

    附言

    在表单提交处理程序或页面加载方法中,您还需要在允许保存操作继续之前检查Page.IsValid == true。

    附言

    如果您想更花哨,您可以在 ClientValidationFunction 属性中提供一个 JavaScript 方法并验证客户端。不过这可能有点过头了。

    【讨论】:

    • 你能帮我用自定义验证器@James写吗
    • 我就是这样做的。不工作。控制不去ServerValidation()
    • 将ValidateEmptyText="True" 也添加到自定义验证器控件中,它应该可以工作。 http://msdn.microsoft.com/en-us/library/9eee01cx(v=vs.85).aspx。如果还没有,请发布您的完整标记和代码隐藏。
    • 放断点时,可以看到arguments.IsValid根据给定的条件正常工作。但即使验证失败,它也会导航到下一页而不是显示 ErrorMessage="Exam date can't be less than today" @James
    • 你是如何渲染你的分页链接的,他们是在做回发还是只是链接?如果它们只是链接验证将不会发生,所有验证器控件都是如此。如果您可以使用回发,您可以在页面回发处理程序中检查Page.IsValid(您的客户验证器结果中的因素)。此外,将分页链接到验证不在此问题的范围内。
    【解决方案2】:

    尝试使用 CustomValidator,如下所示

    ASPX

    <asp:TextBox runat="server" ID="tb_date" BackColor="White" ></asp:TextBox>
    <asp:Calendar ID="EndDate" runat="server" 
               OnSelectionChanged="EndDate_OnSelectionChanged" ></asp:Calendar>
        <asp:CustomValidator ID="CustomValidator1" runat="server" ErrorMessage="Invalid date">
    </asp:CustomValidator><br />
    

    后面的代码:

    protected void EndDate_OnSelectionChanged(object sender, EventArgs e) //COMPARE VALIDATOR FOR EXAM DATE
    {
        CustomValidator1.IsValid = true;
        DateTime SelectedDate = EndDate.SelectedDate.Date;
        DateTime NowDate = DateTime.Now;
        tb_date.Text = SelectedDate.ToShortDateString();
        if (SelectedDate.Date > NowDate.Date)
        {
            CustomValidator1.IsValid = false;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2019-07-13
      • 1970-01-01
      • 2020-11-09
      • 1970-01-01
      • 1970-01-01
      • 2013-04-18
      • 2014-01-19
      • 1970-01-01
      • 2016-03-25
      相关资源
      最近更新 更多