2014-11-03 175 views
2

我已閱讀關於此主題的許多帖子,但我仍在與我的問題作鬥爭。我有一個具有14個屬性和5個複雜類型的自定義模板編輯器的表單。客戶端驗證適用於所有屬性和自定義模板編輯器,但以下屬性。如果我輸入文本,它將刪除文本框中的所有內容,而不會顯示任何消息。但是,如果我輸入2.,我收到錯誤消息,說它必須是一個數字。有沒有人經歷過這種行爲?這也發生在我的其他一些形式上。.NET MVC客戶端驗證在值無效時不顯示屬性消息

作爲一個方面說明:客戶端應驗證可空的int範圍?似乎它不,除非我添加範圍驗證程序。謝謝。

UPDATE 這實際上是所有我的int?性能

型號

[Display(Name = "Lifetime")] 
public int? Life { get; set; } 

查看

@using (Html.BeginForm("EditPerson", "Maintenance", FormMethod.Post, new { @class = "operation-form" })) 
{ 
    @Html.AntiForgeryToken() 
    @Html.HiddenFor(model => model.PersonId) 
    @Html.Hidden("ModifiedBy", User.Identity.Name) 

    <div class="form-horizontal"> 
     @Html.ValidationSummary(false, "", new { @class = "text-danger" }) 
     <div class="col-md-4"> 
     <div class="row person-field"> 
      <div class="col-md-6 field-name"> 
      @Html.LabelFor(model => model.Life) 
      </div> 
      <div class="col-md-6"> 
      @Html.EditorFor(model => model.Life, new { htmlAttributes = new { @class = "to-center routebox" } }) 
      @Html.ValidationMessageFor(model => model.Life, "", new { @class = "text-danger" }) 
      </div> 
     </div> 
     </div> 
    </div> 
} 

@section Scripts { 
@Scripts.Render("~/bundles/jqueryval") 
+0

你是對的,你必須使用範圍驗證器 – 2014-11-03 18:17:57

回答

4

如果您使用的是最新的瀏覽器,該問題可能是使用@Html.EditorFor()默認情況下,這將增加type="number"輸入和結果將生成的瀏覽器實現了一些控制。我只使用Chrome對其進行了測試,但似乎如果輸入的文本不是有效數字,瀏覽器會截取它並阻止設置value屬性。現在,當您回發時,Life爲空,因此有效,並且當您返回視圖時,ModelState值爲空,說明爲什麼它出現在「刪除文本框的全部內容而沒有消息」

您可以通過將其更改爲@Html.TextBoxFor(m => m.Life)來測試此功能,該功能將渲染type="text"。現在,當您輸入文本並嘗試提交時,不顯眼的驗證將阻止提交和顯示「字段生命必須是數字」。至於驗證範圍,如果你沒有給屬性添加適當的屬性(例如,g [Range(0, int.MaxValue)]),那麼jquery.validate.unobtrusive就沒有什麼可以測試,所以它會回發,但是它在服務器上驗證,並且當您返回視圖時,將顯示驗證錯誤,如「值'999999999999999999999999999999999999999999'無效」

+0

它做到了!謝謝。 – 2014-11-04 01:32:19

0

有這樣的選擇:

  1. 使用[Range(0, int.MaxValue)]
  2. 使用[RegularExpression("([0-9]+)")]
  3. 使用[Integer]DataAnnotationExtensions
  4. 使用自己定製的ValidationAttribute與客戶端
+0

謝謝。我之前沒有嘗試過擴展,但使用範圍和正則表達式不會阻止文本框擺脫所有內容。範圍確實驗證了一個實際的整數,但是如果我輸入文本,它仍然會刪除沒有消息的字段 – 2014-11-03 18:39:45

1

註冊一次,我想通了,INT?是問題,我找到了一個解決方案在這裏:

Nullable int validation not showing message for non-numeric values

我所做的只是數據類型註釋添加到所有int?。不知道爲什麼這個工程。

[Display(Name = "Lifetime")] 
[DataType(DataType.Text)] 
public int? Life { get; set; } 
+1

儘管這可能確實會給你找到的結果,但它不是「解決問題」,它只是掩蓋它。這可能會以其他方式回來咬你。不幸的是,你沒有展示足夠的實際模型和實際頁面來診斷真正的問題。 – 2014-11-03 19:12:51

+0

我明白我掩蓋了它。其餘的視圖看起來完全像我的每個屬性的片段,我會認爲模型的其餘部分不會影響此錯誤本身,因爲錯誤發生在所有'int?'屬性上,並且不是特定於模型的。這就是爲什麼我放棄了那些看起來像噪音的其他代碼。 – 2014-11-03 21:22:43

+1

有許多小的,微妙的東西可以影響驗證,如果沒有將整個頁面作爲一個整體來看,而將整個模型作爲一個整體來看,很難看到整個圖像。另外,你包括哪些javascript,安裝了哪些全局過濾器等等。有很多地方可以隱藏問題。 – 2014-11-03 21:43:01

相關問題