編輯:我現在正在爲文本字段工作(請參閱下面的問題的意見)。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,一種爲視圖表單上的所有元素(或可能是元素的子集)啓用自動「驗證即用型」的方法?
感謝。
如果您未禁用客戶端驗證,並且已包含相關腳本,則這是默認行爲。並且你誤解客戶端驗證的工作方式 - 同一個表單視圖再次顯示_是錯誤的 - 當你點擊提交按鈕並且存在驗證錯誤時,表單從不提交或再次顯示__。你不需要你的'$('some-selector')。validate()。element('some-element');'代碼 –
@Stepen Muecke謝謝,但我在這裏有點困惑。一方面,你聲明所描述的行爲(即NO「validation-as-you-type」)是默認的,但是你也聲明我不需要jajvaScript/jQuery行。但是,我應該如何實現「驗證即用型」? (或者你的意思是說「驗證即你的類型」實際上是默認行爲?) 另外,我在這裏使用默認設置:腳手架後,我沒有啓用或禁用任何相關的東西,也沒有我添加或刪除了任何相關的腳本。 – Holland
(續): 此外,您聲明帶有驗證錯誤,表單「永遠不會被提交或再次顯示」......您的意思是沒有任何內容發佈到服務器(即,沒有「POST」或「GET」地方),對嗎?是的,我明白,這只是顯示在客戶端(jS)上添加錯誤消息的同一頁面。 – Holland