愛上MVC~MVC4模型驗(yan)證可以放在前端
MVC4.0推(tui)出后,在模型驗證(zheng)上有了一(yi)個(ge)新的改(gai)近,它支持(chi)前端驗證(zheng),即在用(yong)戶POST之前,如果驗證(zheng)失敗,則Action(POST方式(shi)的)不會(hui)被執行(xing),而直接停留在原視圖(tu),這對于用(yong)戶體(ti)驗是(shi)好的,它就類似于ajax驗證(zheng)一(yi)樣,不會(hui)將(jiang)原頁重定向。
MVC4.0在view中引(yin)用了jqueryval文件后,即(ji)可實(shi)現客戶端實(shi)時驗證(zheng)
@section Scripts { @Scripts.Render("~/bundles/jqueryval") }
如(ru)果你(ni)不需要走JS方(fang)式驗證(zheng),還是使(shi)用原來的(de)POST方(fang)法后再(zai)進(jin)行驗證(zheng)的(de)話,把(ba)上面那(nei)行刪除即可,當然,MVC為(wei)我(wo)(wo)們(men)提(ti)供的(de)驗證(zheng)展示(shi)可能(neng)不是我(wo)(wo)們(men)想要的(de),它(ta)往往會將“驗證(zheng)失敗的(de)提(ti)示(shi)信息”添加(jia)一個<span>然后為(wei)它(ta)加(jia)class,這可能(neng)并不是我(wo)(wo)們(men)想要的(de),因(yin)為(wei)我(wo)(wo)們(men)
的“錯誤提示”往往由前端開發人員提供的,所以,我們最需要的是“純文字”的錯誤提示,現在,我把MVC的ValidationMessageFor擴展方法進行了新的擴展,我叫它ValidationMessageTextFor,它會將模型里的(de)某個字段的(de)驗證(zheng)錯誤的(de)消息進行“純文字”的(de)輸出(chu),不(bu)
會有任何HTML標記,這才是我們所需要的,它也有不足,那就是目前并不支持前端實時模型驗證!
ValidationMessageTextFor原代碼如下,供大家學習與研究:
namespace System.Web.Mvc.Html { /// <summary> /// MVC中對HtmlHelper擴展方法 /// </summary> public static class MvcHtmlExtensions { /// <summary> /// 從ModelState中返回指定鍵(jian)對(dui)應的(de)驗證的(de)錯誤消息(xi) /// </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)); } } }
現在輸出的錯(cuo)誤消息(xi)就(jiu)是純文字,如圖(tu)