【问题标题】:Using the CompareValidator control to compare user input date with today's date使用 CompareValidator 控件将用户输入日期与今天的日期进行比较
【发布时间】:2011-01-16 21:05:04
【问题描述】:

嘿..我想将当前日期与用户输入的日期进行比较..但是,到目前为止我遇到了错误..

我试过这样的:

<asp:TextBox id="txtDate1" runat="server" />    
<asp:CompareValidator runat="server" ErrorMessage="The date must be greater than today"
    ControlToValidate="txtDate1" type="date" 
    ValuetoCompare="DateTime.Today.ToShortDateString()" />

我收到一条错误消息,指出“”的ValueToCompare 属性的DateTime.Today.ToShortDateString() 的值无法转换为“日期”类型 我也试过ValueToCompare="DateTime.Now.Date()",我得到了同样的错误信息。

请帮助我,我非常感激。

【问题讨论】:

  • 我们可以在后面的代码中设置ValueToCompare。 Comparevalidator1.ValueToCompare = DateTime.Today.ToShortDateString();

标签: asp.net .net validation comparevalidator


【解决方案1】:

您只是将ValueToCompare 属性用作文字字符串。如果要执行代码以获取动态值,则需要在其中使用 ASP 标签。试试这个:

<asp:comparevalidator runat="server" 
  errormessage="The date must be greater than today"
  controltovalidate="txtDate1" type="date" 
  valuetocompare="<%# DateTime.Today.ToShortDateString() %>" />

然后在您的Page_Load 方法中,调用Page.DataBind()

这将在页面加载时执行数据绑定器代码,并将值放在引号之间。

【讨论】:

  • this show me 'Comparevalidator1' 的 ValueToCompare 属性的值 '' 无法转换为类型 'Date'。
  • 抱歉 - 我忘了提到您还需要在 Page_Load 方法中调用“Page.DataBind()”。
  • 只是想知道,如果这需要您在 Page_Load 中调用 DataBind(),您是否也可以在 Page_Load 中写 MyCompareValidator.ValueToCompare = DateTime.Today.ToShortDateString(); 吗?
  • 你错过了Operator="GreaterThan",否则它将被视为相等
  • @comecme 我已经通过在后面的代码中设置ValueToCompare 来发布答案。
【解决方案2】:
    <asp:CompareValidator ID="CompareValidator3" runat="server" 
                        ControlToValidate="TextBox1" ErrorMessage="Date should be on or after today" 
                        Operator="GreaterThanEqual" Type="Date">
</asp:CompareValidator>

在页面加载事件中设置要比较的验证器的值

CompareValidator3.ValueToCompare = DateTime.Now.ToShortDateString();

【讨论】:

    【解决方案3】:

    我们可以在后面的代码中设置ValueToCompare

            if (!Page.IsPostBack)
            {
               string currentDate = DateTime.Today.ToShortDateString();
               Comparevalidator1.ValueToCompare = currentDate;
            }
    

    对于比较验证器:

        <asp:CompareValidator ID="Comparevalidator1" runat="server" ErrorMessage="The date must be greater than today"
        Operator="GreaterThan" ControlToValidate="txtDate1" Type="date" Display="Dynamic" />
    

    为什么不使用 Page.DataBind?

    考虑以下场景。我需要仅在单击“操作”按钮时显示网格视图。数据源以声明方式定义。但是,如果我使用 Page.DataBind() 它会在页面加载时显示网格。

     <form id="form1" runat="server">
     <asp:TextBox ID="txtDate1" CssClass="firstBox" runat="server" Text=""></asp:TextBox>
     <asp:CompareValidator ID="Comparevalidator1" runat="server" ErrorMessage="The date must be greater than today"
        Operator="GreaterThan" ControlToValidate="txtDate1" Type="date" Display="Dynamic" />
     <asp:Button ID="btnAction" class="submitButton" runat="server" Text="Action" OnClick="btnAction_Click" />
     <asp:Button ID="btnDummy" class="submitButton" runat="server" Text="Dummy" OnClick="btnDummy_Click" />
     <br />
     <br />
    
     <asp:GridView ID="GridView1" runat="server" DataSource="<%# EmployeesResult %>">
     </asp:GridView>
     </form>
    

    后面的代码

    public partial class ThirdTest : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            //Page.DataBind();
    
            if (!Page.IsPostBack)
            {
               string currentDate = DateTime.Today.ToShortDateString();
               txtDate1.Text = currentDate;
               Comparevalidator1.ValueToCompare = currentDate;
            }
        }
    
        protected void btnAction_Click(object sender, EventArgs e)
        {
            GridView1.DataBind();
            string value = GridView1.DataSource.ToString();
        }
    
        protected void btnDummy_Click(object sender, EventArgs e)
        {
    
        }
    
        //Propertry
        public List<Employee> EmployeesResult
        {
            get
            {
                List<Employee> employees = new List<Employee>();
                employees.Add(new Employee { EmpID = 1, EmpName = "Emp1" });
                employees.Add(new Employee { EmpID = 2, EmpName = "Emp2" });
                return employees;
            }
        }
      }
    

    【讨论】:

      【解决方案4】:

      试试这个。

      <asp:RequiredFieldValidator ID="RequiredFieldValidator3" runat="server" ErrorMessage="Date is required" ControlToValidate="txtmDate"></asp:RequiredFieldValidator>
      
      <asp:RegularExpressionValidator ID="RegularExpressionValidator1" runat="server" ErrorMessage="Date is not valid (MM.DD.YYYY)" ControlToValidate="txtDate" ValidationExpression="(0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])[- /.](19|20)\d\d" ></asp:RegularExpressionValidator>
      

      用户输入日期(日期格式)的方式也很重要。在这里,我使用了 MM.DD.YYYY 日期格式。

      <asp:CompareValidator ID="CompareValidatorGreaterThanToday" runat="server" ErrorMessage="The date must be greater than today" ControlToValidate="txtDate" Type="date" Operator="GreaterThan" ValueToCompare="<%# DateTime.Today.ToShortDateString() %>" ></asp:CompareValidator>
      

      然后在您的 Page_Load 方法 (*.aspx.cs) 中,调用 Page.DataBind()。

      例子:

      protected void Page_Load(object sender, EventArgs e)
      {            
         Page.DataBind();
      }
      

      【讨论】:

        【解决方案5】:

        试试下面写的:

        <asp:CompareValidator runat="server" ErrorMessage="The date must be greater than today"
        ControlToValidate="txtDate1" type="DateTime" 
        ValuetoCompare='<%# DateTime.Now.ToString("d") '%> />
        

        【讨论】:

        • CompareValidator 需要 Currency、Date、Double、Integer 或 String 作为类型。在 Visual Studio 中检查 Intellisense。我正在使用 VS2008 和 Asp.Net 3.5。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-26
        • 2014-11-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多