NET Core-學習筆記(三)

神牛003發表於2016-07-22

這裡將要和大家分享的是學習總結第三篇;首先感慨一下這周跟隨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         }
View Code

這裡的特性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 Code

並且通過自動生成對應的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     }
View Code

使用這個這個自定義的驗證,和上面的驗證是一樣的:

測試的話,重新執行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     }
View Code

此時在瀏覽器訪問文章列表的路由: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();
View Code

生成的時候會報錯,直接複製我這裡的程式碼有問題,因為找不到某個包,這裡需要通過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格式的資料方式就完成了,大家可以試試,今天就分享到這裡,謝謝。

相關文章