ASP.NET?MVC遍歷驗證ModelState的錯誤信息
在ASP.NET MVC中,ModelState中包含了驗證失敗的錯誤信息,具體被存儲在ModelState.Values[i].Errors[j].ErrorMessage屬性中。當(dāng)然,通過打斷點(diǎn),單步調(diào)試可以查看具體的驗證失敗錯誤信息,但有時候希望把ModelState中的驗證失敗信息遍歷顯示出來。
ModelState類型是ModelStateDictionary,ModelStateDictionary是一個字典集合,鍵是模型的各個屬性,值是模型各個屬性對應(yīng)的ModelState。
ModelState的Errors屬性存儲了所有驗證失敗信息,是一個ModelErrorCollection類型,ModelErrorCollection是一個ModelError的集合,而ModelError的ErrorMessage屬性包含了驗證失敗錯誤信息。
大致是這樣:
- ModelStateDictionary實(shí)際上是IDictionary<string, ModelState>類型
- ModelState.Errors屬性實(shí)際上是ModelErrorCollection類型
- ModelErrorCollection實(shí)際上是ICollection<ModelError>類型
- ModelError.ErrorMessage屬性存儲著所有驗證失敗信息
如何把驗證失敗信息顯示出來呢?
{"屬性1","屬性1驗證失敗錯誤信息1"},
{"屬性1","屬性1驗證失敗錯誤信息2"},
{"屬性2","屬性2驗證失敗錯誤信息1"}
......
想寫成如上的樣子,通過json讀取出來,在后臺遍歷,都可以。
那就先抽象出一個顯示錯誤信息的模型。
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類型,那就針對ModelStateDictionary類型寫一個擴(kuò)展方法。就是把ModelStateDictionary中的驗證失敗信息連同對應(yīng)的屬性讀取出來,注入到ShowError這個模型中,并最終得到一個IEnumerable<ShowError>集合。
public static class ModelStateExtensions
{
public static IEnumerable<ShowError> AllModelStateErrors(this ModelStateDictionary modelState)
{
var result = new List<ShowError>();
//找到出錯的字段以及出錯信息
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;
//獲取鍵對應(yīng)的錯誤信息
var fieldErrors = item.Errors
.Select(e => new ShowError(fieldKey, e.ErrorMessage));
result.AddRange(fieldErrors);
}
return result;
}
}再來一個最終用來測試驗證失敗錯誤信息的視圖模型。
public class Student
{
public int Id { get; set; }
[Required(ErrorMessage = "必填")]
[StringLength(5, ErrorMessage = "長度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中,有一個Action用來呈現(xiàn)Student的強(qiáng)類型視圖頁,有一個Action用來把從ModelState中獲取到的所有屬性以及對應(yīng)的驗證失敗信息以json格式返回給前臺視圖。
public class HomeController : Controller
{
public ActionResult Index()
{
return View(new Student());
}
[HttpPost]
public ActionResult GetErrors(Student student)
{
if (ModelState.IsValid)
{
return Content("沒有錯誤信息~~");
}
Response.StatusCode = 400;
Response.TrySkipIisCustomErrors = true;
var modelErrors = ModelState.AllModelStateErrors();
return Json(modelErrors);
}
}在Home/Index.cshtml視圖中,當(dāng)點(diǎ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>
}最終,在控制臺顯示驗證失敗信息如下:

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,謝謝大家對腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請查看下面相關(guān)鏈接
相關(guān)文章
詳解ASP.NET Core 2.0 路由引擎之網(wǎng)址生成(譯)
這篇文章主要介紹了詳解ASP.NET Core 2.0 路由引擎之網(wǎng)址生成(譯),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-11-11
.net core webapi通過中間件獲取請求和響應(yīng)內(nèi)容的方法
這篇文章主要介紹了.net core webapi通過中間件獲取請求和響應(yīng)內(nèi)容的方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下2019-09-09
合并兩個DataSet的數(shù)據(jù)內(nèi)容的方法
合并兩個DataSet的數(shù)據(jù)內(nèi)容的方法,需要的朋友可以參考一下2013-03-03
.Net彈性和瞬態(tài)故障處理庫Polly實(shí)現(xiàn)執(zhí)行策略
這篇文章介紹了.Net彈性和瞬態(tài)故障處理庫Polly實(shí)現(xiàn)執(zhí)行策略的方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-06-06
asp.net HttpWebRequest自動識別網(wǎng)頁編碼
HttpWebRequest獲取網(wǎng)頁源代碼時自動識別網(wǎng)頁編碼,通過讀取頁面中的charset和讀取http頭中的編碼信息獲取頁面的編碼,基本可以正確獲取網(wǎng)頁編碼2008-09-09
用ASP.NET做的個性化的郵件發(fā)送系統(tǒng)
如果要你用ASP來做一個郵件發(fā)送系統(tǒng),你一定認(rèn)為這是一個比較復(fù)雜的工作。其實(shí)也的確是這樣。但當(dāng)他的后繼產(chǎn)品ASP.NET被推出以后,他的強(qiáng)大功能就使的這一切就變的相對簡單了。真的這樣神奇么?我們就通過ASP.NET做一個郵件發(fā)送系統(tǒng),看看到底有什么奧秘,是不是真的簡單。2008-02-02
詳解ASP.NET Core3.0 配置的Options模式
這篇文章主要介紹了詳解ASP.NET Core3.0 配置的Options模式,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08
ASP.NET站點(diǎn)導(dǎo)航應(yīng)用詳解
這篇文章主要內(nèi)容是ASP.NET站點(diǎn)導(dǎo)航,主要包括站點(diǎn)導(dǎo)航以及動態(tài)修改內(nèi)存中的站點(diǎn)地圖,感興趣的小伙伴們可以參考一下2015-09-09

