遍歷ModelState中存儲的錯誤信息


在服務器端驗證中,有時我們添加了一個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();
        }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM