真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

ASP.NET之在MVC中如何使用服務端驗證-創(chuàng)新互聯(lián)

這篇文章給大家分享的是有關ASP.NET之在MVC中如何使用服務端驗證的內(nèi)容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

專業(yè)領域包括成都網(wǎng)站制作、成都做網(wǎng)站、商城建設、微信營銷、系統(tǒng)平臺開發(fā), 與其他網(wǎng)站設計及系統(tǒng)開發(fā)公司不同,創(chuàng)新互聯(lián)建站的整合解決方案結(jié)合了幫做網(wǎng)絡品牌建設經(jīng)驗和互聯(lián)網(wǎng)整合營銷的理念,并將策略和執(zhí)行緊密結(jié)合,為客戶提供全網(wǎng)互聯(lián)網(wǎng)整合方案。

首先我們創(chuàng)建一個ASP.NET MVC項目,本人環(huán)境是VS2017,

ASP.NET之在MVC中如何使用服務端驗證

創(chuàng)建成功后通過在Nuget中使用 Install-Package FluentValidation -Version 7.6.104 安裝FluentValidation

在Model文件夾中添加兩個實體Address 和 Person

public class Address
 {
 public string Home { get; set; }

 public string Phone { get; set; }
 }
public class Person
 {
 /// 
 /// 姓名
 /// 
 public string Name { get; set; }
 /// 
 /// 年齡
 /// 
 public int Age { get; set; }
 /// 
 /// 性別
 /// 
 public bool Sex { get; set; }

 /// 
 /// 地址
 /// 
 public Address Address { get; set; }
 }

緊接著創(chuàng)建實體的驗證器

public class AddressValidator : AbstractValidator
 {  public AddressValidator()  {  this.RuleFor(m => m.Home)  .NotEmpty()  .WithMessage("家庭住址不能為空");  this.RuleFor(m => m.Phone)  .NotEmpty()  .WithMessage("手機號碼不能為空");  }  }
public class PersonValidator : AbstractValidator
 {
 public PersonValidator()
 {
 this.RuleFor(p => p.Name)
 .NotEmpty()
 .WithMessage("姓名不能為空");

 this.RuleFor(p => p.Age)
 .NotEmpty()
 .WithMessage("年齡不能為空");

 this.RuleFor(p => p.Address)
 .SetValidator(new AddressValidator());

 }
 }

為了更好的管理驗證器,我建議將使用一個Manager者來管理所有驗證器的實例。如ValidatorHub

public class ValidatorHub
 {
 public AddressValidator AddressValidator { get; set; } = new AddressValidator();

 public PersonValidator PersonValidator { get; set; } = new PersonValidator();
 }

現(xiàn)在我們需要創(chuàng)建一個頁面,在默認的HomeController 控制器下添加2個Action:ValidatorTest,他們一個用于展示頁面,另一個則用于提交。

[HttpGet]
 public ActionResult ValidatorTest()
 {
 return View();
 }

 [HttpPost]
 public ActionResult ValidatorTest(Person model)
 {
 return View();
 }

為 ValidatorTest 添加視圖,選擇Create模板,實體為Person

ASP.NET之在MVC中如何使用服務端驗證

將默認的@Html全部刪掉,因為在我們本次介紹中不需要,我們的目標是搭建一個前后端分離的項目,而不要過多的依賴于MVC。

最終我們將表單改寫成了

@using (Html.BeginForm())
{
 @Html.AntiForgeryToken()

 
 
Person
   @Html.ValidationSummary(true, "", new { @class = "text-danger" })    姓名      
 
   年齡      
     住址            電話            性別                         }

注意,由于我們的實體Person中存在復雜類型Address,我們都知道,表單提交默認是Key:Value形式,而在傳統(tǒng)表單的key:value中,我們無法實現(xiàn)讓key為Address的情況下Value為一個復雜對象,因為input一次只能承載一個值,且必須是字符串。實際上MVC中存在模型綁定,此處不作過多介紹(因為我也忘記了-_-||)。

簡單的說就是他能根據(jù)你所需要類型幫我們自動盡可能的轉(zhuǎn)換,我們目前只要知道如何正確使用,在Address中存在Home屬性和Phone屬性,我們可以將表單的name設置為Address.Home,MVC的模型綁定會將Address.Home解析到對象Address上的Home屬性去。

簡單的校驗方式我也不過多介紹了。再上一章我們已經(jīng)了解到通過創(chuàng)建一個實體的驗證器來對實體進行驗證,然后通過IsValid屬性判斷是否驗證成功。對,沒錯,對于大家來說這太簡單了。但我們每次校驗都創(chuàng)建一個驗證器是否顯得有點麻煩呢?不要忘了我們剛剛創(chuàng)建了一個ValidatorHub,我們知道控制器默認繼承自Controller,如果我們想為控制器擴展一些能力呢?現(xiàn)在我要創(chuàng)建一個ControllerEx了,并繼承自Controller。

public class ControllerEx : Controller
 {
 protected Dictionary DicError { get; set; } = new Dictionary();

 protected ValidatorHub ValidatorHub { get; set; } = new ValidatorHub();

 protected override void OnActionExecuted(ActionExecutedContext filterContext)
 {
 base.OnActionExecuted(filterContext);
 ViewData["Error"] = DicError;
 }

 protected void ValidatorErrorHandler(ValidationResult result)
 {
 foreach (var failure in result.Errors)
 {
 if (!this.DicError.ContainsKey(failure.PropertyName))
 {
  this.DicError.Add(failure.PropertyName, failure.ErrorMessage);
 }
 }
 }
 }

在ControllerEx里我創(chuàng)建了一個ValidatorHub屬性,正如其名,他內(nèi)部存放著各種驗證器實體呢。有了它,我們可以在需要驗證的Action中通過this.ValidatorHub.具體驗證器就能完成具體驗證工作了,而不需要再去每次new 一個驗證器。

同樣我定義了一個DicError的鍵值對集合,他的鍵和值類型都是string。key是驗證失敗的屬性名,而value則是驗證失敗后的錯誤消息,它是用來存在驗證的結(jié)果的。

在這里我還定義了一個ValidatorErrorHandler的方法,他有一個參數(shù)是驗證結(jié)果,通過名稱我們大致已經(jīng)猜到功能了,驗證錯誤的處理,對驗證結(jié)果的錯誤信息進行遍歷,并將錯誤信息添加至DicError集合。

最終我需要將這個DicError傳遞給View,簡單的辦法是ViewData["Error"] 但我不想在每個頁面都去這么干,因為這使我要重復多次寫這行代碼,我會厭倦它的。很棒的是MVC框架為我們提供了Filter(有的地方也稱函數(shù)鉤子,切面編程,過濾器),能夠方便我們在生命周期的不同階段進行控制,很顯然,我的需求是在每次執(zhí)行完Action后要在末尾添加一句ViewData["Error"]=DicError。于是我重寫了OnActionExecuted方法,僅添加了 ViewData["Error"] = DicError;

現(xiàn)在我只需要將HomeController繼承自ControllerEx即可享受以上所有功能了。

現(xiàn)在基本工作基本都完成了,但我們還忽略了一個問題,我錯誤是存在了ViewData["Error"]里傳遞給View,只不過難道我們在驗證錯誤的時候在頁面顯示一個錯誤列表?像li一樣?這顯然不是我們想要的。我們還需要一個幫助我們合理的顯示錯誤信息的函數(shù)。在Razor里我們可以對HtmlHelper進行擴展。于是我為HtmlHelper擴展了一個方法ValidatorMessageFor

public static class ValidatorHelper
 {
 public static MvcHtmlString ValidatorMessageFor(this HtmlHelper htmlHelper, string property, object error)
 {
 var dicError = error as Dictionary;

 if (dicError == null) //沒有錯誤
 {
 // 不會等于空
 }
 else
 {
 if (dicError.ContainsKey(property))
 {
  return new MvcHtmlString(string.Format("

{0}

", dicError[property]));  }  }  return new MvcHtmlString("");  }  }

在ValidatorMessaegFor里需要2個參數(shù)property 和 error

前者是需要顯示的錯誤屬性名,后者則是錯誤對象即ViewData["Error"],功能很簡單,在發(fā)現(xiàn)錯誤對象里存在key為錯誤屬性名的時候?qū)alue用一個p標簽包裹起來返回,value即為錯誤屬性所對應的錯誤提示消息。

現(xiàn)在我們還需要在View每一個input下添加一句如: @Html.ValidatorMessageFor("Name", ViewData["Error"])即可。

@using (Html.BeginForm())
{
 @Html.AntiForgeryToken()

 
 
Person
   @Html.ValidationSummary(true, "", new { @class = "text-danger" })    姓名      @Html.ValidatorMessageFor("Name", ViewData["Error"])        年齡      @Html.ValidatorMessageFor("Name", ViewData["Error"])        住址      @Html.ValidatorMessageFor("Address.Home", ViewData["Error"])        電話      @Html.ValidatorMessageFor("Address.Phone", ViewData["Error"])        性別                          }

到此我們的所有基本工作都已完成

[HttpPost]
 public ActionResult ValidatorTest(Person model)
 {
 var result = this.ValidatorHub.PersonValidator.Validate(model);
 if (result.IsValid)
 {
 return Redirect("https://www.baidu.com");
 }
 else
 {
 this.ValidatorErrorHandler(result);
 }
 return View();
 }

通過我們在ControllerEx種的ValidatorHub來對實體Person進行校驗,如果校驗成功了....這里沒啥可干的就當跳轉(zhuǎn)一下表示咯,否則的話調(diào)用Ex中的ValidatorErrorHandler 將錯誤消息綁定到ViewData["Error"]中去,這樣就能在前端View渲染的時候?qū)㈠e誤消息顯示出來了。

接下來我們將程序跑起來。

ASP.NET之在MVC中如何使用服務端驗證ASP.NET之在MVC中如何使用服務端驗證

ASP.NET之在MVC中如何使用服務端驗證ASP.NET之在MVC中如何使用服務端驗證

正如大家所看到的,當我點擊提交的時候 雖然只有電話沒輸入但其他三個表單被清空了,也許我們會覺得不爽,當然如果你需要那相信你在看完上述的錯誤信息綁定后一定也能解決這個問題的,但事實上,我們并不需要它,\(^o^)/~

為什么呢?因為我們還要前端驗證啊,當前端驗證沒通過的時候根本無法發(fā)送到后端來,所以不用擔心用戶在一部分驗證失敗時已填寫的表單數(shù)據(jù)被清空掉。

這里提到在表單提交時需要前端校驗,既然有前端校驗了為何還要我們做后臺校驗呢?不是脫了褲子放屁嗎?事實上,前端校驗的作用在于優(yōu)化用戶體驗,減輕服務器壓力,也可以防住君子,但絕不能防止小人,由于Web客戶端的不確定性,任何東西都可以模擬的。如果不做服務端驗證,假如你的系統(tǒng)涉及金錢,也許那天你醒來就發(fā)現(xiàn)自己破產(chǎn)了。

來一個通過驗證的。

ASP.NET之在MVC中如何使用服務端驗證ASP.NET之在MVC中如何使用服務端驗證

感謝各位的閱讀!關于“ASP.NET之在MVC中如何使用服務端驗證”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!


當前名稱:ASP.NET之在MVC中如何使用服務端驗證-創(chuàng)新互聯(lián)
瀏覽路徑:http://weahome.cn/article/gsepi.html

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部