2017-02-27 28 views
0

編輯:我現在正在爲文本字段工作(請參閱下面的問題的意見)。ASP.NET/MVC:自動「驗證即用型」?

但是,由於某種原因,我的下拉列表中沒有啓用驗證。

在我的ViewModel我有這樣的:

[Display(Name = "Country")] 
[Required(ErrorMessage = "{0} is definitely required!")] 
public int CountryId { get; set; } 

在我看來,我有這樣的:

@Html.LabelFor(m => m.CountryId, new { @class = "col-md-2 control-label" }) 
<div class="col-md-10"> 
    @Html.DropDownListFor(m => m.CountryId, Model.CountryList, "—Select a country --", 
     new { @class = "form-control" }) 
    <div class="container_voor_error"> 
     @Html.ValidationMessageFor(m => m.CountryId, "", new { @class = "text-danger" }) 
    </div> 
</div> 

控制器中的代碼不需要在這裏給予我想,既然它正常工作:它填充CountryList與國家,然後在提交後進行服務器端驗證和處理,沒有問題。

所以情況是這樣的:

  • 我在下拉列表中(比如,比利時)選擇一個國家;
  • 然後我再次取消選擇該選項,以便再次顯示「 - 選擇一個國家 - 」;

  • 現在,(懶惰)客戶端驗證應該啓動並導致錯誤消息:「國家肯定是必需的!」;

  • 但是,這並沒有發生,沒有顯示錯誤消息。

所以...我忘記了什麼,或者做錯了什麼?

END-OF-EDIT

的MVC/ASP.NET專家一個簡單的問題,我想。但是,我仍然在這個框架(學校課程)中找到自己的方式,這是我一直想知道的,而且我還沒有找到明確的答案。

這是關於表單輸入的客戶端驗證,在我的模型(或視圖模型)中使用註釋。我明白,只要有一個或多個註釋的驗證要求不滿足,表單字段的值在提交時就不會發送到服務器。而是再次顯示相同的表單視圖,這次顯示適用的錯誤消息。也就是說,假設這些錯誤消息的HTML助手(如Html.ValidationMessageFor)包含在表單字段中。到現在爲止還挺好。

但是,還有「驗證即用型」之類的東西。這意味着錯誤消息在用戶仍然正在輸入時出現(並且改變),而不是僅在用戶點擊提交後出現在重新加載的表單上。這是我的問題:「驗證即用型」是否應該自動運行?因爲這是互聯網資源/教程似乎通常暗示(雖然幾乎沒有明確說明)。我的經驗已經不同了:爲了讓「驗證即用型」,我總是需要編寫JavaScript/jQuery事件處理程序(如keyUp()和onChange()),其中I顯式調用

$('some-selector').validate().element('some-element'); 

所以我的問題是:這是正常的,我必須爲每個待驗證表單元素做出方法的validate()這些明確的電話?或者,在ASP中。NET/MVC,一種爲視圖表單上的所有元素(或可能是元素的子集)啓用自動「驗證即用型」的方法?

感謝。

+0

如果您未禁用客戶端驗證,並且已包含相關腳本,則這是默認行爲。並且你誤解客戶端驗證的工作方式 - 同一個表單視圖再次顯示_是錯誤的 - 當你點擊提交按鈕並且存在驗證錯誤時,表單從不提交或再次顯示__。你不需要你的'$('some-selector')。validate()。element('some-element');'代碼 –

+0

@Stepen Muecke謝謝,但我在這裏有點困惑。一方面,你聲明所描述的行爲(即NO「validation-as-you-type」)是默認的,但是你也聲明我不需要jajvaScript/jQuery行。但是,我應該如何實現「驗證即用型」? (或者你的意思是說「驗證即你的類型」實際上是默認行爲?) 另外,我在這裏使用默認設置:腳手架後,我沒有啓用或禁用任何相關的東西,也沒有我添加或刪除了任何相關的腳本。 – Holland

+0

(續): 此外,您聲明帶有驗證錯誤,表單「永遠不會被提交或再次顯示」......您的意思是沒有任何內容發佈到服務器(即,沒有「POST」或「GET」地方),對嗎?是的,我明白,這只是顯示在客戶端(jS)上添加錯誤消息的同一頁面。 – Holland

回答

0

不,ASP.NET MVC不提供自動「鍵入時驗證」。要「鍵入時進行驗證」,它必須是JavaScript代碼。 ASP.NET Mvc默認使用jQuery驗證插件,並且此插件確實對模糊事件進行驗證,這與關鍵事件不一樣。

ASP.NET MVC所做的一切,都是爲元素呈現一些html屬性,也稱爲不顯眼驗證。如果您看到頁面源代碼啓用了驗證,然後禁用了,則可以檢查該代碼。然後有一個javscript庫,它使用這些屬性中的值來連接正確的事件。

最後,還可以爲此使用不同的插件/庫,並且還可以更改ASP.NET向客戶端發出驗證的方式。

+1

'jquery.validate'在'.keyup'上驗證! (請參閱[documentation](https://jqueryvalidation.org/documentation/),特別是標題爲_的部分 - 在演示時使用的幾點注意事項_ –