這里將要和大家分享的是學習總結第三篇;首先感慨一下這周跟隨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格式的數據方式就完成了,大家可以試試,今天就分享到這里,謝謝。
文章列表