2013-11-21 35 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") 
 
    });

相關問題