今早要實作一個功能,需要使用 ASP.NET MVC 的 HiddenFor 對 Model 作 validation,卻發現沒有作用?
我首先是在 VS2012 上使用 MVC4 作的。
Model
public class TestModel { [Required] public string Name { get; set; } }
而 cshtml 也是異常的簡單
@model MvcApplication2.Models.TestModel @{ ViewBag.Title = "TestHidden"; } @using (Html.BeginForm()) { @Html.ValidationSummary(true) <fieldset> <legend>TestModel</legend> <div class="editor-label"> @Html.LabelFor(model => model.Name) </div> <div class="editor-field"> @Html.HiddenFor(m => m.Name) @Html.ValidationMessageFor(model => model.Name) </div> <p> <input type="submit" value="Create" /> </p> </fieldset> } <div> @Html.ActionLink("Back to List", "Index") </div> @section Scripts{ @Scripts.Render("~/bundles/jqueryval") }
然而,ASP.NET MVC validation 就是不會檢查。
怪的是,同樣地程式碼,使用 ASP.NET MVC 4 在 VS2010 上卻會檢查??
比較兩方的差異,除了 .net framework 版本不同之外,就是 javascript library 的版本不同了。
再 check 一下,發現只要把 jQuery validation 1.9 換成 1.8 的版本,就正常了。Bingo!!
原來在 jQuery validation 1.9 release note 上有提到
Another change should make the setup of forms with hidden elements easier, these are now ignored by default (option “ignore” has “:hidden” now as default).
所以,不管是 <input type=’hidden’ />, 或者是 <input style=’display:none’ /> 都不再會被檢核。
那要如何在 jQuery validation 1.9 上運作正常呢?幸好還是有解的
$.validator.setDefaults({ ignore: [] });
20121120 附註:
在:hidden 的區塊中,以 jQuery 使用 data 設定 data-val 屬性並沒有作用。試驗的結果,必須使用 $(selector).attr(‘data-val’, false) 來動態開啟/關閉 jQuery validation 對單一輸入的檢核。