在服務器端驗證中,有時我們添加了一個ModelError,然后還需要將該信息以JS的形式返回到客戶端。如:
[HttpPost] public ActionResult Index(LogOnModel model) { if (string.IsNullOrEmpty(model.UserName)) { ModelState.AddModelError("UserName", "請輸入用戶名。"); return JavaScript("alert('請輸入用戶名')"); } if (string.IsNullOrEmpty(model.PassWord)) { ModelState.AddModelError("UserName", "請輸入密碼。"); return JavaScript("alert('請輸入密碼')"); } if (string.IsNullOrEmpty(model.CheckCode)) { ModelState.AddModelError("UserName", "請輸入驗證碼。"); return JavaScript("alert('請輸入驗證碼')"); } if (ModelState.IsValid) { Response.Write("asdf"); } return View(); }
這樣重寫一遍固然可以,但卻做了重復的工作,如果我們能獲取添加在ModelState中的錯誤信息,則可以省去不少的工作。
ModelState本身是一個字典,並且存儲了驗證失敗的信息。具體被存儲在ModelState.Values[i].Errors[j].ErrorMessage屬性中。
ModelState的Errors屬性存儲了所有驗證失敗信息,是一個ModelErrorCollection類型,ModelErrorCollection是一個ModelError的集合,而ModelError的ErrorMessage屬性包含了驗證失敗錯誤信息。
大致是這樣:
○ ModelStateDictionary實際上是IDictionary<string, ModelState>類型
○ ModelState.Errors屬性實際上是ModelErrorCollection類型
○ ModelErrorCollection實際上是ICollection<ModelError>類型
○ ModelError.ErrorMessage屬性存儲着所有驗證失敗信息
接下來的工作,其實就是如何把這個驗證信息找出來。我們先手工添加一條驗證信息,然后試圖顯示它:
ModelState.AddModelError("UserName", "請輸入用戶名。"); return JavaScript("alert('" + ModelState.Values.First().Errors[0].ErrorMessage + "')");
上面的代碼中,Values集合表示的為不同的鍵值,而Errors則表示同一鍵值下的不同信息。
ModelState.AddModelError("UserName", "請輸入用戶名。"); ModelState.AddModelError("UserName", "用戶名不正確。"); ModelState.AddModelError("PassWord", "請輸入密碼。"); ModelState.AddModelError("PassWord", "密碼不正確。"); //輸出第一條 return Content(ModelState.Values.First().Errors[0].ErrorMessage); //輸出第二條 return Content(ModelState.Values.First().Errors[1].ErrorMessage); //輸出第三條 return Content(ModelState.Values.Skip(1).First().Errors[0].ErrorMessage); //輸出第四條 return Content(ModelState.Values.Skip(1).First().Errors[1].ErrorMessage);
清楚了這些,遍歷一個ModelState也就不難了。
StringBuilder errinfo = new StringBuilder(); foreach (var s in ModelState.Values) { foreach (var p in s.Errors) { errinfo.AppendFormat("{0}\\n", p.ErrorMessage); } } return JavaScript("alert('" + errinfo.ToString() + "')");
以下分別是集中顯示錯誤信息和依次顯示錯誤信息的代碼:
集中顯示錯誤信息:
[HttpPost] public ActionResult Index(LogOnModel model) { if (string.IsNullOrEmpty(model.UserName)) { ModelState.AddModelError("UserName", "請輸入用戶名。"); } if (string.IsNullOrEmpty(model.PassWord)) { ModelState.AddModelError("PassWord", "請輸入密碼。"); } if (string.IsNullOrEmpty(model.CheckCode)) { ModelState.AddModelError("ChkCode", "請輸入驗證碼。"); } if (!ModelState.IsValid) { StringBuilder errinfo = new StringBuilder(); foreach (var s in ModelState.Values) { foreach (var p in s.Errors) { errinfo.AppendFormat("{0}\\n", p.ErrorMessage); } } return JavaScript("alert('" + errinfo.ToString() + "')"); } return View(); }
依次逐條顯示錯誤信息:
[HttpPost] public ActionResult Index(LogOnModel model) { if (string.IsNullOrEmpty(model.UserName)) { ModelState.AddModelError("UserName", "請輸入用戶名。"); return JavaScript("alert('" + ModelState.Values.First().Errors[0].ErrorMessage + "')"); } if (string.IsNullOrEmpty(model.PassWord)) { ModelState.AddModelError("UserName", "請輸入密碼。"); return JavaScript("alert('" + ModelState.Values.First().Errors[0].ErrorMessage + "')"); } if (string.IsNullOrEmpty(model.CheckCode)) { ModelState.AddModelError("UserName", "請輸入驗證碼。"); return JavaScript("alert('" + ModelState.Values.First().Errors[0].ErrorMessage + "')"); } if (ModelState.IsValid) { } return View(); }