C# 不引人注目的客户端验证规则必须是唯一的

C# 不引人注目的客户端验证规则必须是唯一的,c#,validation,data-annotations,asp.net-mvc-5,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)中,它发出以下消息 不引人注目的客户端验证规则中的验证类型名称必须是唯一的。以下验证类型被多次看到:date 阶级 元数据 [MetadataType(typeof(FileTransferFilterCriteria.FileTransferFilterCriteriaMetaD

环境:Visual Studio 2013和Mvc 5

我正在将我的网站从VS 2010和MVC 3升级到VS 2013和MVC 5。这在VS 2010和MVC 3中工作得很好,在升级项目(VS 2013和MVC 5)中,它发出以下消息

不引人注目的客户端验证规则中的验证类型名称必须是唯一的。以下验证类型被多次看到:date

阶级

元数据

[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

这里怎么了?

VS 2010和MVC 3项目生成的HTML:

<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>

从日期上载
上传至最新
当我去掉date属性时,生成的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>

从日期上载

上传至最新

即使我去掉了date属性,在为上面的线程提取html之后,仍然会进行验证。我把验证码留在那里了

这促使我进行另一次搜索,并发现以下内容:

评论人:srkirkland在页面中间:

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

我会确认这一点,并更新网站/文档以反映这一点。我也会 看看我是否可以做一个检查,只添加验证 属性(如果 属性的类型为DateTime)


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

我刚才说得太快了,仍然需要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>

在MVC5中也有同样的问题。在我的模型中,我有:

using DataAnnotationsExtensions;
using System;
using System.ComponentModel.DataAnnotations;
我所做的是删除默认的“using DataAnnotationsExtensions;”语句,只留下:

using System;
using System.ComponentModel.DataAnnotations;

到目前为止,这在不中断任何现有验证程序(包括我的自定义功能)的情况下修复了它。

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

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


@Html.EditorFor(model=>model.CmpnySearchReportCriteria.ReportReturnDueDateFrom)
尝试删除
[DataType(DataType.DateTime)]
。是的,这是我错误地发现的。。。感谢仍然存在如下所述的问题。我已将from和to日期的数据类型都更改为“string”,并对其应用了date属性。FF,IE,Opera在Chrome还没有正确验证的地方工作。我删除了日期属性,然后应用了regex属性,Chrome这次也工作得很好。看起来Mvc 5和dataannotations.org出现了某种问题。
<!-- ***** Validate ***** -->
<script src="/Scripts/Core/jquery.validate.js"></script>
<script src="/Scripts/Core/jquery.validate.unobtrusive.js"></script>
using DataAnnotationsExtensions;
using System;
using System.ComponentModel.DataAnnotations;
using System;
using System.ComponentModel.DataAnnotations;