不显眼的客户端验证规则必须是唯一的

时间:2013-11-21 23:03:23

标签: c# validation data-annotations asp.net-mvc-5

环境:Visual Studio 2013和Mvc 5

我正在从VS 2010升级我的网站& MVC 3到VS 2013& MVC 5.这适用于VS 2010& MVC 3,与升级项目(VS 2013& MVC 5)一样,它出现以下消息错误。

不显眼的客户端验证规则中的验证类型名称必须是唯一的。以下验证类型多次出现:日期

public partial class FileTransferFilterCriteria
    {
        public string Fice { get; set; }
        public string SourceEmail { get; set; }
        public string TargetEmail { get; set; }

        public DateTime? FromDate { get; set; }
        public DateTime? ToDate { get; set; }

        public string Status { get; set; }
        public string Category { get; set; }
    }

元数据

[MetadataType(typeof(FileTransferFilterCriteria.FileTransferFilterCriteriaMetaData))]
    public partial class FileTransferFilterCriteria
    {
        public class FileTransferFilterCriteriaMetaData
        {
            [DataType(DataType.DateTime)]
            [Date(ErrorMessage = ValidationMessageConstants.InvalidDate)]
            [UIHint(UiHintEditorTemplateConstants.DateCalendar)]
            [UIHint(UiHintDisplayTemplateConstants.Date)]
            public DateTime? FromDate { get; set; }

            [DataType(DataType.DateTime)]
            [Date(ErrorMessage = ValidationMessageConstants.InvalidDate)]
            [UIHint(UiHintEditorTemplateConstants.DateCalendar)]
            [UIHint(UiHintDisplayTemplateConstants.Date)]
            public DateTime? ToDate { get; set; }
        }

    }

HTML

<tr>
                    <th>Upload From Date</th>
                    <td>
                        @Html.EditorFor(x => x.Criteria.FromDate, UiHintEditorTemplateConstants.DateCalendar)
                        @Html.ValidationMessageFor(x => x.Criteria.FromDate)
                    </td>
                </tr>
                <tr>
                    <th>Upload To Date</th>
                    <td>
                        @Html.EditorFor(x => x.Criteria.ToDate, UiHintEditorTemplateConstants.DateCalendar)
                        @Html.ValidationMessageFor(x => x.Criteria.ToDate)
                    </td>
                </tr>

编辑模板

@using System.Globalization

@model DateTime?


@Html.TextBox("", 
(Model != null && 
Model.HasValue && 
!Model.Value.ToString(CultureInfo.InvariantCulture).Contains("1900") &&
!Model.Value.ToString(CultureInfo.InvariantCulture).Contains("0001") 
? 
Model.Value.ToString("MM/dd/yyyy") 
: 
string.Empty), 
new { @class = "datePicker", maxlength = "12", size = "12" })

这里有什么问题?

来自VS 2010的结果HTML&amp; MVC 3项目:

<tr>
                    <th>Upload From Date</th>
                    <td>



<input class="datePicker" data-val="true" data-val-date="Invalid date specified. Date should be like MM/DD/YYYY." id="Criteria_FromDate" maxlength="12" name="Criteria.FromDate" size="12" type="text" value="" />

                        <span class="field-validation-valid" data-valmsg-for="Criteria.FromDate" data-valmsg-replace="true"></span>
                    </td>
                </tr>
                <tr>
                    <th>Upload To Date</th>
                    <td>



<input class="datePicker" data-val="true" data-val-date="Invalid date specified. Date should be like MM/DD/YYYY." id="Criteria_ToDate" maxlength="12" name="Criteria.ToDate" size="12" type="text" value="" />

                        <span class="field-validation-valid" data-valmsg-for="Criteria.ToDate" data-valmsg-replace="true"></span>
                    </td>
                </tr>

结果HTML - VS 2013和MVC 5,当我取出日期属性时:

<tr>
                    <th>Upload From Date</th>
                    <td>


<input class="datePicker" data-val="true" data-val-date="The field Upload From Date must be a date." id="Criteria_FromDate" maxlength="12" name="Criteria.FromDate" size="12" type="text" value="" />

                        <br/><span class="field-validation-valid" data-valmsg-for="Criteria.FromDate" data-valmsg-replace="true"></span>
                    </td>
                </tr>
                <tr>
                    <th>Upload To Date</th>
                    <td>


<input class="datePicker" data-val="true" data-val-date="The field Upload To Date must be a date." id="Criteria_ToDate" maxlength="12" name="Criteria.ToDate" size="12" type="text" value="" />

                        <br/><span class="field-validation-valid" data-valmsg-for="Criteria.ToDate" data-valmsg-replace="true"></span>
                    </td>
                </tr>

4 个答案:

答案 0 :(得分:1)

最近我将MVC3应用程序升级到MVC4应用程序并将目标框架更改为4.0。我没有构建错误。

但是,我在下面的行中得到了同样的错误

  @Html.EditorFor(model => model.CmpnySearchReportCriteria.ReportReturnDueDateFrom)

数据注释属性在模型中修饰如下。

[Display(Name = "Due Date From")]
[DataType(DataType.Date, ErrorMessage = "Please enter a valid date (format: MM/DD/YYYY) for From Report / Return Due Date.")]
public DateTime? ReportReturnDueDateFrom { get; set; }

我已经为日期输入字段编写了自定义客户端验证规则,如下所示。因为MVC3中没有日期的自动类型检查验证。

public class ModelClientValidationDateRule : ModelClientValidationRule
{
     public ModelClientValidationDateRule(string errorMessage)
     {
           ErrorMessage = errorMessage;
           ValidationType = "date";
      }
}

观察到,MVC4为任何DateTime字段添加了自动类型检查验证。在MVC4中,默认客户端验证消息的呈现方式如下所示。

data-val-date =“字段 {PropertyName} 必须是日期。”

  

由于我们的自定义客户端验证规则data-val-date   属性呈现两次。这是造成这个错误的原因,即   “不显眼的客户端验证规则中的验证类型名称必须是   独特的“。

<input class="datefield hasDatepicker" **data-val="true" data-val-date="The field UpdateDate must be a date." data-val-date="Please enter a valid date (format: MM/DD/YYYY) for From Date."** id="UpdateDate" name="UpdateDate" type="text" value="">

解决此问题 -

  1. 评论数据注释属性

    public class PreInvoiceSearchCriteria { //[DataType(DataType.Date, ErrorMessage = "Please enter a valid date //(format: MM/DD/YYYY) for From Date.")] public DateTime? RenewDate { get; set; } }

  2. 如果您不想要默认验证消息,可以使用下面的JQuery更新它。

  3. $(document).ready(function () {
    
            $('#DateOfInc').attr("data-val-date", "Please enter a valid date   (format: MM/DD/YYYY) for Date of Inc")
        });

答案 1 :(得分:0)

即使我拿出了date属性,在获取上述线程的html后仍然会进行验证。我把验证码留在那里。

这促使我进行另一次搜索并找到以下内容: https://github.com/srkirkland/DataAnnotationsExtensions/issues/46

  

评论人:srkirkland走向页面中间:

     

我认为MVC4为任何DateTime添加了自动类型检查验证   字段,所以基本上如果你的属性是DateTime类型,那么   [Date]属性不是必需的(并且会出错,如上所述)。如果   你有一个你希望格式化为日期的字符串属性,你仍然可以   使用[日期]。

     

我会确认并更新网站/文档以反映它。我也会   看看我能否以某种方式进行检查并仅添加验证   在适当的情况下属性(基本上,MVC3及以下,如果   属性是DateTime类型。

这引出了与editorfor一起使用的日历控件的另一点。根据这里的一条评论,在chrome中,jquery和chrome日历控件将同时显示...

答案 2 :(得分:0)

我刚刚发言太快,仍需要Chrome版本31.0.1650.57 m的帮助。

验证在FF,IE和Opera中正常工作

提交代码:

searchFormSubmit: function ($form, currentForm) {
        //close all clue tips
        JSGlobalVars.ClueTipClose();

        if ($form.valid()) {
            var $button = $("#" + FileTransferHome._enum.SubmitButton);
            var $searchResults = $("#" + FileTransferHome._enum.SearchResultsDivId);

            jMessage("Processing request...", $button, true, false);
            $.ajax({
                cache: false,
                url: currentForm.action,
                type: currentForm.method,
                data: $form.serialize(),
                error: function (xhr, ajaxOptions, thrownError) {
                    jMessageHide();
                    $searchResults.html(xhr.responseText).addClass(JSGlobalVars.MessageBoxError).fadeIn('slow');
                },
                success: function (result) {
                    jMessageHide();
                    $searchResults.removeClass(JSGlobalVars.MessageBoxError).html(result).fadeIn('slow');
                    location.hash = "SEARCHRESULTS";
                }
            });
        }
    }

添加以下文件进行验证:

<!-- ***** Validate ***** -->
<script src="/Scripts/Core/jquery.validate.js"></script>
<script src="/Scripts/Core/jquery.validate.unobtrusive.js"></script>

答案 3 :(得分:0)

在MVC 5中遇到同样的问题。在我的模型中,我有:

using DataAnnotationsExtensions;
using System;
using System.ComponentModel.DataAnnotations;

我所做的是删除默认&#34;使用DataAnnotationsExtensions;&#34;声明只留下:

using System;
using System.ComponentModel.DataAnnotations;

到目前为止,这已经修复了它,而没有破坏任何现有的验证器,包括我的自定义函数。