是否可以添加逻辑来影响RequiredFieldValidator的行为方式?

时间:2013-02-07 17:14:05

标签: asp.net validation

我在Jquery的页面上添加了文本框来创建一个datepicker。问题是,文本框在回发后不保留值。经过研究,我发现following solution完美无缺,即文本框在回发后保持其值。

<th>
   <asp:CustomValidator ID="customStartDate" runat="server" 
    ErrorMessage="Start Date" Display = "None" ControlToValidate = "txtStartDate"
    ValidationGroup ="HireGroup" ClientValidationFunction ="StartDate_Validate"/>
    Start Date: 
</th>
<td>
   <asp:TextBox ID="txtStartDate" runat="server" Width = "140" ReadOnly = "true"
   TabIndex = "5" CssClass = "datepicker" ></asp:TextBox>
   <asp:HiddenField ID="hfDatePicker" runat="server"/>
</td>

这是Jquery代码

//Set datePicker
function SetUpDatePicker() {
 var $allDatepickers = $('.datepicker');
 $.each($allDatepickers, function () {
    $(this).datepicker({
        showOn: "button",
        buttonImage: "Images/calendar.gif",
        buttonImageOnly: true,
        minDate: 1,
        altField: '[id*="hfDatePicker"]'
    });


    var $hfDatePicker = $('[id*="hfDatePicker"]');
    var val = $($hfDatePicker).attr('Value');
    $(this).val(val);

    var len = $($hfDatePicker).attr('Value').length;
    if (len > 0) {
        $(this).datepicker("setDate", new Date($($hfDatePicker).attr("Value")));
    }
  });
}

现在我有一个不同类型的问题。我无法使用RequiredFieldValidator作为HiddenField,因为我收到错误“隐藏字段无法验证”。

我正在尝试使用CustomValidator,但问题是此控件仅在 ControlToValidate 不为空时才起作用。

我已检查RequiredFieldValidator的所有属性,但看不到 ClientValidationFunction 属性。

关于如何解决这个问题的任何建议?

1 个答案:

答案 0 :(得分:2)

(基于@ Richard77的评论,我会将其作为一个真正的答案。)

你有几个选择......

不使用<asp:Hidden>,而是使用普通<asp:TextBox>,但使用style='display:none;属性隐藏它。这样您就可以根据需要使用<asp:RequiredFieldValidator>

另一种方法是使用<asp:CustomValidator>并添加ValidateEmptyText='true'属性。即使TextBox为空,这也会强制验证程序运行代码。

更新 - 考虑到这一点后,我不推荐以下内容,因为我无法(我能想到)覆盖该功能的服务器端版本,因此会离开你容易受到漏洞的影响。如果您出于视觉原因纯粹使用它,并且不需要在服务器上检查实际数据,那么这很好。但是,这是一种不寻常的情况。

最终选项(但不是我必须推荐的选项)是覆盖ASP.NET生成的函数。在ASP.NET生成的脚本链接之后,需要将它放在您的页面上,类似于......

function RequiredFieldValidatorEvaluateIsValid(val) {
  if(val.controltovalidate=="myValidatorId"){
    // your coding here
  } else {
    return (ValidatorTrim(ValidatorGetValue(val.controltovalidate)) != ValidatorTrim(val.initialvalue))
  }
}