2013-11-21 30 views
0

环境:Visual Studio的2013和MVC 5不显眼的客户端验证规则必须是唯一的

我升级我的网站从2010年VS & 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 & 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> 

生成的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

尝试移除'[数据类型(DataType.DateTime)]'。 –

+0

是的,这就是我发现的错误...谢谢 –

+0

仍然有一个问题,如下所述。 –

回答

0

我只是说了太快,仍然需要与Chrome版本31.0.1650.57米的帮助。

验证是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"; 
       } 
      }); 
     } 
    } 

以下文件:在MVC 5

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

我已将数据类型更改为“字符串”,来自日期和应用日期属性。 FF,IE,Opera的工作原理在于Chrome仍然没有正确验证它。 –

+0

我删除了日期属性,然后应用了正则表达式属性和chrome,这次也起作用。 看起来像Mvc 5和dataannotations.org有一些问题。 –

0

即使我拿了out日期属性,验证仍然发生后,拾取上述线程的HTML。我将验证码留在那里。

这促使我再拍搜索,发现以下几点: https://github.com/srkirkland/DataAnnotationsExtensions/issues/46

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

我觉得MVC4增加了自动类型检查验证,任何的DateTime 字段,所以基本上如果你的属性是DateTime类型的话,那么 [Date]属性就没有必要(并且会出错,就像上面那样)。如果 你有一个你想格式化为日期的字符串属性,你仍然可以使用[日期] 。

我会确认这一点,并更新网站/文档以反映它。我还会 看看我能否以某种方式进行检查,并且只在适当的情况下添加验证 属性(实质上,MVC3以及如果 属性属于DateTime类型)。

这引出了用于editorfor的日历控件的另一点。每一个评论在这里,铬在一个jQuery和铬日历控件将显示在同一时间...

0

有同样的问题在我的模型中我有:

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

我所做的是删除默认的“使用DataAnnotationsExtensions;”声明只留下:

using System; 
using System.ComponentModel.DataAnnotations; 

到目前为止,这已修复它而不会中断任何现有的验证器,包括我的自定义函数。

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。

$(document).ready(function() { 
 

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

相关问题