ASP.NET MVC遍歷驗(yàn)證ModelState的錯(cuò)誤信息
在ASP.NET MVC中,ModelState中包含了驗(yàn)證失敗的錯(cuò)誤信息,具體被存儲(chǔ)在ModelState.Values[i].Errors[j].ErrorMessage屬性中。當(dāng)然,通過(guò)打斷點(diǎn),單步調(diào)試可以查看具體的驗(yàn)證失敗錯(cuò)誤信息,但有時(shí)候希望把ModelState中的驗(yàn)證失敗信息遍歷顯示出來(lái)。
ModelState類型是ModelStateDictionary,ModelStateDictionary是一個(gè)字典集合,鍵是模型的各個(gè)屬性,值是模型各個(gè)屬性對(duì)應(yīng)的ModelState。
ModelState的Errors屬性存儲(chǔ)了所有驗(yàn)證失敗信息,是一個(gè)ModelErrorCollection類型,ModelErrorCollection是一個(gè)ModelError的集合,而ModelError的ErrorMessage屬性包含了驗(yàn)證失敗錯(cuò)誤信息。
大致是這樣:
- ModelStateDictionary實(shí)際上是IDictionary<string, ModelState>類型
- ModelState.Errors屬性實(shí)際上是ModelErrorCollection類型
- ModelErrorCollection實(shí)際上是ICollection<ModelError>類型
- ModelError.ErrorMessage屬性存儲(chǔ)著所有驗(yàn)證失敗信息
如何把驗(yàn)證失敗信息顯示出來(lái)呢?
{"屬性1","屬性1驗(yàn)證失敗錯(cuò)誤信息1"},
{"屬性1","屬性1驗(yàn)證失敗錯(cuò)誤信息2"},
{"屬性2","屬性2驗(yàn)證失敗錯(cuò)誤信息1"}
......
想寫成如上的樣子,通過(guò)json讀取出來(lái),在后臺(tái)遍歷,都可以。
那就先抽象出一個(gè)顯示錯(cuò)誤信息的模型。
public class ShowError {public ShowError(string key, string message){ Key = key; Message = message;}public string Key { get; set; }public string Message { get; set; } }
由于ModelState是ModelStateDictionary類型,那就針對(duì)ModelStateDictionary類型寫一個(gè)擴(kuò)展方法。就是把ModelStateDictionary中的驗(yàn)證失敗信息連同對(duì)應(yīng)的屬性讀取出來(lái),注入到ShowError這個(gè)模型中,并最終得到一個(gè)IEnumerable<ShowError>集合。
public static class ModelStateExtensions {public static IEnumerable<ShowError> AllModelStateErrors(this ModelStateDictionary modelState){ var result = new List<ShowError>(); //找到出錯(cuò)的字段以及出錯(cuò)信息 var errorFieldsAndMsgs = modelState.Where(m => m.Value.Errors.Any()).Select(x => new {x.Key, x.Value.Errors}); foreach (var item in errorFieldsAndMsgs) {//獲取鍵var fieldKey = item.Key;//獲取鍵對(duì)應(yīng)的錯(cuò)誤信息var fieldErrors = item.Errors .Select(e => new ShowError(fieldKey, e.ErrorMessage));result.AddRange(fieldErrors); } return result;} }
再來(lái)一個(gè)最終用來(lái)測(cè)試驗(yàn)證失敗錯(cuò)誤信息的視圖模型。
public class Student {public int Id { get; set; }[Required(ErrorMessage = "必填")][StringLength(5, ErrorMessage = "長(zhǎng)度1-5位")]public string Name { get; set; }[Required(ErrorMessage = "必填")]public int Age { get; set; }[Required(ErrorMessage = "必填")][Range(typeof(Decimal), "0", "100", ErrorMessage = "{0} 必須是數(shù)字介于 {1} 和 {2}之間.")]public decimal Score { get; set; } }
在HomeController中,有一個(gè)Action用來(lái)呈現(xiàn)Student的強(qiáng)類型視圖頁(yè),有一個(gè)Action用來(lái)把從ModelState中獲取到的所有屬性以及對(duì)應(yīng)的驗(yàn)證失敗信息以json格式返回給前臺(tái)視圖。
public class HomeController : Controller {public ActionResult Index(){ return View(new Student());}[HttpPost]public ActionResult GetErrors(Student student){ if (ModelState.IsValid) {return Content("沒(méi)有錯(cuò)誤信息~~"); } Response.StatusCode = 400; Response.TrySkipIisCustomErrors = true; var modelErrors = ModelState.AllModelStateErrors(); return Json(modelErrors);} }
在Home/Index.cshtml視圖中,當(dāng)點(diǎn)擊"提交"按鈕,在控制臺(tái)顯示驗(yàn)證失敗信息。
@model MvcApplication1.Models.Student@{ ViewBag.Title = "Index"; Layout = "~/Views/Shared/_Layout.cshtml";}<h2>Index</h2>@using (Html.BeginForm("GetErrors", "Home", FormMethod.Post, new {id = "addForm"})){ @Html.TextBoxFor(m => m.Name) <br /> @Html.TextBoxFor(m => m.Age) <br /> @Html.TextBoxFor(m => m.Score) <br /> <input type="button" id="up" value="提交" />}@section scripts{ <script type="text/javascript">$(function () { $("#up").on("click", function () {$.post("@Url.Action("GetErrors")", $("#addForm").serialize()).fail(function(error) { var response = JSON.parse(error.responseText); for (var i = 0; i < response.length; i++) {var e = response[i];var fieldKey = e.Key;var message = e.Message;console.log(fieldKey + ": " + message); }}); });}); </script>}
最終,在控制臺(tái)顯示驗(yàn)證失敗信息如下:
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)的支持。如果你想了解更多相關(guān)內(nèi)容請(qǐng)查看下面相關(guān)鏈接
相關(guān)文章:
1. ASP.NET MVC實(shí)現(xiàn)區(qū)域或城市選擇2. ASP.NET MVC增加一條記錄同時(shí)添加N條集合屬性所對(duì)應(yīng)的個(gè)體3. ASP.NET MVC通過(guò)勾選checkbox更改select的內(nèi)容4. ASP.NET MVC獲取多級(jí)類別組合下的產(chǎn)品5. ASP.NET MVC視圖頁(yè)使用jQuery傳遞異步數(shù)據(jù)的幾種方式詳解6. ASP.NET MVC使用JSAjaxFileUploader插件實(shí)現(xiàn)單文件上傳7. ASP.NET MVC使用jQuery的Load方法加載靜態(tài)頁(yè)面及注意事項(xiàng)8. ASP.NET MVC使用Session會(huì)話保持表單狀態(tài)9. ASP.NET MVC實(shí)現(xiàn)橫向展示購(gòu)物車10. log4net在Asp.net MVC4中的使用過(guò)程
