C# 不引人注目的客户端验证规则必须是唯一的
环境:Visual Studio 2013和Mvc 5 我正在将我的网站从VS 2010和MVC 3升级到VS 2013和MVC 5。这在VS 2010和MVC 3中工作得很好,在升级项目(VS 2013和MVC 5)中,它发出以下消息 不引人注目的客户端验证规则中的验证类型名称必须是唯一的。以下验证类型被多次看到:date 阶级 元数据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
[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;