這裡將要和大家分享的是學習總結第三篇;首先感慨一下這周跟隨netcore官網學習是遇到的一些問題:
a.官網的英文版教程使用的部分nuget包和我當時安裝的最新包版本不一致,所以沒法按照教材上給出的列子測試例項,官網給出的一句話暫未釋出最新包
b.某些資料不夠詳細只是一句話,加上網速慢,查閱資料不行啊
好了,感慨完後,下面是本篇將要分享的學習步奏,對於剛學或者即將要學習的朋友做個相互交流:
1.Model Validation(實體模型驗證)
2.自定義驗證屬性
3.建立一個介面支援返回json,xml兩種資料格式
下面一步一個腳印的來分享:
1.Model Validation(實體模型驗證)
實體模型驗證,直接通過新增註解的方式來定義需要驗證的格式,要使用註解必須在實體類檔案中引用System.ComponentModel.DataAnnotations該名稱空間,寫法如下:
紅色框裡面的就是用法,直接寫在屬性欄位上方中括號('[]')括起來,小括號('()')裡面是傳遞的引數,這裡截圖用到了Required:必填,StringLength(100):最小輸入字元長度100,ClasssicMoive(1960):自定義驗證,DataType(DataType.Date):屬性為日期格式;還有很多常用的驗證特性,具體可以去這個地址:https://docs.asp.net/en/latest/mvc/models/validation.html;
這裡重點說這兩個:
Remote(使用遠端驗證):通俗一點講就是通過指定的路由去後臺驗證該屬性的值知否有效,屬於伺服器驗證;方法的例項用法如下(這裡介紹一種用法,至於過載的方法各位可以試試):
這裡需要的引數是routeName:就是路由,後面的一些屬性非必填,咋們按照預設的來寫一個
首先,定義一個驗證是否包含有Blogs字樣的路由,程式碼如下:
1 [AcceptVerbs("Get", "Post")] 2 public JsonResult IsContainerBlogs(string title) 3 { 4 5 if (!title.Contains("Blogs") || string.IsNullOrEmpty(title)) 6 { 7 8 return Json("Title裡面沒有Blogs字樣!"); 9 } 10 return Json(true); 11 }
這裡的特性AcceptVerbs,主要是用來限制只允許get,post請求
然後,定義個文章實體如下格式:
1 public class Article 2 { 3 [Required] 4 public int ID { get; set; } 5 6 [Remote(action: "IsContainerBlogs", controller: "ArticlesFormat")] 7 public string Title { get; set; } 8 public DateTime CreateTime { get; set; } 9 }
並且通過自動生成對應的View和Controller(這裡主要演示remote效果,具體生成view和Controller操作可以參照前面寫的一篇: NET Core-學習筆記(一)),好的咋們啟動dotnet run命令,訪問建立文章的頁面,先來看下Title屬性生成的html程式碼:
紅框的部分路徑就是咋們之前在實體裡面指定的Action和Controller的路由,再來看下效果:
沒有Blogs會提示剛才路由定義方法返回的錯誤資訊,
有Blogs的Title結果直接新增成功,
RegularExpression(使用正則寫法驗證):按照自定義的RegExp規則來驗證資料的有效性;
還是用Title做例子,註釋掉之前的Remote,換成RegularExpression,程式碼如:[RegularExpression(pattern:"d+",ErrorMessage ="不符合正則規則")],這裡限制Title內容只能是數字,我們執行測試結果如下:
2.自定義驗證屬性
要實現自定義模型驗證,需要繼承:System.ComponentModel.DataAnnotations.ValidationAttribute,這裡直接上程式碼,更詳細的說明看下在程式碼註釋裡面建立一個ModelRegexExtendAttribute類繼承ValidationAttribute:
1 public class ModelRegexExtendAttribute : ValidationAttribute 2 { 3 private string _pattern; 4 public ModelRegexExtendAttribute(string pattern = @"\d+", string errorMessage = "必須滿足正則") 5 { 6 _pattern = pattern; 7 this.ErrorMessage = errorMessage; 8 } 9 10 11 protected override ValidationResult IsValid(object value, ValidationContext validationContext) 12 { 13 //validationContext.DisplayName:指定某個實體類的屬性 14 //獲取指定屬性的相關屬性資訊 15 var t = validationContext.ObjectType.GetProperty(validationContext.DisplayName); 16 //獲取對應屬性的值 17 var p = t.GetValue(validationContext.ObjectInstance, null); 18 19 //做正則做匹配 20 if (Regex.IsMatch(p.ToString().ToUpper(), _pattern)) 21 { 22 23 return ValidationResult.Success; 24 } 25 26 return new ValidationResult(this.ErrorMessage); 27 } 28 29 }
使用這個這個自定義的驗證,和上面的驗證是一樣的:
測試的話,重新執行dotnet run,然後重新整理剛才新增文字的頁面,具體驗證操作和上面一樣
3.建立一個介面支援返回json,xml兩種資料格式
首先,我們建立一個名為ArticlesFormatController的Controller(其實就是第二點說的那個Controller),然後通過注入ApplicationDbContext訪問文章的列表資料(這裡大家可以看下 學習筆記(一)的連結資料庫),ArticlesFormatController具體實現的方法有:
1 public class ArticlesFormatController : Controller 2 { 3 4 private readonly ApplicationDbContext _context; 5 6 public ArticlesFormatController(ApplicationDbContext context) 7 { 8 9 _context = context; 10 } 11 12 [Route("[controller]/[action]")] 13 public async Task<List<Article>> GetArticles() 14 { 15 16 return await _context.Article.ToListAsync(); 17 } 18 19 20 //[Route("[controller]/[action]/{id}.{format?}")] 21 public async Task<Article> GetArticle(int? id) 22 { 23 24 if (id == null) 25 { 26 27 return new Article(); 28 } 29 return await _context.Article.Where(b => b.ID == id).SingleOrDefaultAsync(); 30 } 31 32 public string GetArticleName(int? id) 33 { 34 if (id == null) 35 { 36 37 return string.Empty; 38 } 39 return _context.Article.Where(b => b.ID == id).SingleOrDefaultAsync().Result.Title; 40 } 41 42 43 [AcceptVerbs("Get", "Post")] 44 public JsonResult IsContainerBlogs(string title) 45 { 46 47 if (!title.Contains("Blogs") || string.IsNullOrEmpty(title)) 48 { 49 50 return Json("Title裡面沒有Blogs字樣!"); 51 } 52 return Json(true); 53 } 54 55 }
此時在瀏覽器訪問文章列表的路由:http://localhost:5000/ArticlesFormat/GetArticles得到如下圖:
此時定義的Controller返回的是json資料,這個是框架預設的返回json;
接下來,在Startup.cs檔案的ConfigureServices服務方法中,找到預設生成的services.AddMvc()程式碼,我們改造成這樣:
1 services.AddMvc(op => 2 { 3 4 op.OutputFormatters.Add(new XmlSerializerOutputFormatter()); 5 }).AddXmlSerializerFormatters();
生成的時候會報錯,直接複製我這裡的程式碼有問題,因為找不到某個包,這裡需要通過nuget新增:Microsoft.AspNetCore.Mvc.Formatters.Xml包到專案中:
ok,此時再Startup.cs中就可以直接引用一個空間:using Microsoft.AspNetCore.Mvc.Formatters然後再生成下專案,這樣是否不編譯錯誤了呢;
接著,dotnet run再次執行啟動專案,瀏覽器直接訪問http://localhost:5000/ArticlesFormat/GetArticles出來的還是json資料,有些失望的感覺,但是通常介面形式都會指定接收屬性型別Accept的型別,那麼我們這樣試試,使用DHCgoogle外掛(其實就是post,get訪問工具);
先來一個json資料:
截圖有點大勿噴,再來一個xml返回的資料:
最後的圖有點長,希望稽核人員不要在意,這裡的返回json和xml格式的資料方式就完成了,大家可以試試,今天就分享到這裡,謝謝。