我們可以采用4種不同的編程模式來(lái)進(jìn)行針對(duì)綁定參數(shù)的驗(yàn)證。
一、手工驗(yàn)證綁定的參數(shù)
在定義具體Action方法的時(shí)候,對(duì)已經(jīng)成功綁定的參數(shù)實(shí)施手工驗(yàn)證無(wú)疑是一種最為直接的編程方式,接下來(lái)我們通過(guò)一個(gè)簡(jiǎn)單的實(shí)例來(lái)演示如何將參數(shù)驗(yàn)證邏輯實(shí)現(xiàn)在對(duì)應(yīng)的Action方法中,并在沒(méi)有通過(guò)驗(yàn)證的情況下將錯(cuò)誤信息響應(yīng)給客戶端。我們?cè)谝粋€(gè)ASP.NET MVC應(yīng)用中定義了如下一個(gè)Person類作為被驗(yàn)證的數(shù)據(jù)類型,它的Name、Gender和Age三個(gè)屬性分別表示一個(gè)人的姓名、性別和年齡。
public class Person { [DisplayName("姓名")] public string Name { get; set; } [DisplayName("性別")] public string Gender { get; set; } [DisplayName("年齡")] public int? Age { get; set; } } 接下來(lái)我們定義了如下一個(gè)HomeController。在針對(duì)GET請(qǐng)求的Action方法Index中,我們創(chuàng)建了一個(gè)Person對(duì)象并將其作為Model呈現(xiàn)在對(duì)應(yīng)的View中。另一個(gè)支持POST請(qǐng)求的Index方法具有一個(gè)Person類型的參數(shù),我們?cè)谠揂ction方法中先調(diào)用Validate方法對(duì)這個(gè)輸入?yún)?shù)實(shí)施驗(yàn)證。如果驗(yàn)證成功(ModeState.IsValid屬性返回True),我們返回一個(gè)內(nèi)容為“輸入數(shù)據(jù)通過(guò)驗(yàn)證”的ContentResult,否則將此參數(shù)作為Model呈現(xiàn)在對(duì)應(yīng)的View中。
public class HomeController : Controller { [HttpGet] public ActionResult Index() { return View(new Person()); } [HttpPost] public ActionResult Index(Person person) { Validate(person); if (!ModelState.IsValid) { return View(person); } else { return Content("輸入數(shù)據(jù)通過(guò)驗(yàn)證"); } } private void Validate(Person person) { if (string.IsNullOrEmpty(person.Name)) { ModelState.AddModelError("Name", "'Name'是必需字段"); } if (string.IsNullOrEmpty(person.Gender)) { ModelState.AddModelError("Gender", "'Gender'是必需字段"); } else if (!new string[] { "M", "F" }.Any( g => string.Compare(person.Gender, g, true) == 0)) { ModelState.AddModelError("Gender", "有效'Gender'必須是'M','F'之一"); } if (null == person.Age) { ModelState.AddModelError("Age", "'Age'是必需字段"); } else if (person.Age > 25 || person.Age < 18) { ModelState.AddModelError("Age", "有效'Age'必須在18到25周歲之間"); } } } 如上面的代碼片斷所示,我們?cè)赩alidate該方法中我們對(duì)作為參數(shù)的Person對(duì)象的3個(gè)屬性進(jìn)行逐條驗(yàn)證,如果提供的數(shù)據(jù)沒(méi)有通過(guò)驗(yàn)證,我們會(huì)調(diào)用當(dāng)前ModelState的AddModelError方法將指定的驗(yàn)證錯(cuò)誤消息轉(zhuǎn)換為ModelError保存起來(lái)。我們采用的具體的驗(yàn)證規(guī)則如下。
Person對(duì)象的Name、Gender和Age屬性均為必需字段,不能為Null(或者空字符串)。
新聞熱點(diǎn)
疑難解答
圖片精選