环境: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>
答案 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="">
解决此问题 -
评论数据注释属性
public class PreInvoiceSearchCriteria
{
//[DataType(DataType.Date, ErrorMessage = "Please enter a valid date
//(format: MM/DD/YYYY) for From Date.")]
public DateTime? RenewDate { get; set; }
}
如果您不想要默认验证消息,可以使用下面的JQuery更新它。
$(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;
到目前为止,这已经修复了它,而没有破坏任何现有的验证器,包括我的自定义函数。