文章出處

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


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()