MVC4.0推出后,在模型驗證上有了一個新的改近,它支持前端驗證,即在用戶POST之前,如果驗證失敗,則Action(POST方式的)不會被執行,而直接停留在原視圖,這對於用戶體驗是好的,它就類似於ajax驗證一樣,不會將原頁重定向。
MVC4.0在view中引用了jqueryval文件后,即可實現客戶端實時驗證
@section Scripts { @Scripts.Render("~/bundles/jqueryval") }
如果你不需要走JS方式驗證,還是使用原來的POST方法后再進行驗證的話,把上面那行刪除即可,當然,MVC為我們提供的驗證展示可能不是我們想要的,它往往會將“驗證失敗的提示信息”添加一個<span>然后為它加class,這可能並不是我們想要的,因為我們
的“錯誤提示”往往由前端開發人員提供的,所以,我們最需要的是“純文字”的錯誤提示,現在,我把MVC的ValidationMessageFor擴展方法進行了新的擴展,我叫它ValidationMessageTextFor,它會將模型里的某個字段的驗證錯誤的消息進行“純文字”的輸出,不
會有任何HTML標記,這才是我們所需要的,它也有不足,那就是目前並不支持前端實時模型驗證!
ValidationMessageTextFor原代碼如下,供大家學習與研究:
namespace System.Web.Mvc.Html { /// <summary> /// MVC中對HtmlHelper擴展方法 /// </summary> public static class MvcHtmlExtensions { /// <summary> /// 從ModelState中返回指定鍵對應的驗證的錯誤消息 /// </summary> /// <typeparam name="TModel"></typeparam> /// <typeparam name="TProperty"></typeparam> /// <param name="htmlHelper"></param> /// <param name="expression"></param> /// <returns></returns> public static MvcHtmlString ValidationMessageTextFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression) { var fieldName = ExpressionHelper.GetExpressionText(expression); var modelState = htmlHelper.ViewData.ModelState; if (!modelState.Keys.Contains(fieldName)) return null; if (modelState[fieldName].Errors.Count == 0) return null; IList<string> errList = new List<string>(); modelState[fieldName].Errors.ToList().ForEach(i => { errList.Add(i.ErrorMessage); }); return MvcHtmlString.Create(string.Join(",", errList)); } } }
現在輸出的錯誤消息就是純文字,如圖