起先跟朋友在寫專案時,在登入遇到了許多難題,在討論的過程中,發現Attribute是個很神奇的語法,似乎加上一串程式碼,背後就替我們完成了很多事情,因此對Attribute產生了許多疑問,於是趁著假日趕快弄懂Attribute的原理,趁著還記憶還清晰的時候,趕快把Code記錄下來,以便未來要使用的時候可以複製貼上。
大致上可以將Attribute解釋為,透過外部的程式碼,管理內部程式碼的概念,也就是說只要加入了Attribute,就會在背地裡替我們執行其他的事情,有可能是驗證、有可能是過濾,也有可能是我們想統一管理的方法。
參考來源:
2.[ASP.Net MVC] 自訂Custom Validation Attribute進行Model驗證
這二篇在做的事情有點不同,寫Code的方式也不同。
第一項在做的事情是過濾資料,第二項在做的事情是驗證資料,事件觸發。
這篇文章在紀錄的是第一篇的過濾資料方式,未來有空再寫資料驗證這塊。
廢話不多說直接開始,建議照著步驟做
一、建立Model
using System;
public class Article
{
public string Author { get; set; }
public string Title { get; set; }
public string Content { get; set; }
public DateTime PostOn { get; set; }
}
二、建立Attribute
using System;
public class SilencerAttribute : Attribute
{
public SilencerMode Mode { get; set; }
}
public enum SilencerMode
{
/// <summary>
/// 普通
/// </summary>
Normal,
/// <summary>
/// 嚴謹
/// </summary>
Strict
}
3.這部分做的是取得列舉型別後,依據型別做Switch資料過濾,如果有其他資料想過濾,可以在建構子的地方自行帶資料進來過濾。
當然,在Switch中的邏輯也必須自行更換。
using System;
using System.Reflection;
public class ArticlesFactory
{
public Article CreateArticles(Bulletin bulletin)
{
// 先建立Article的資料
Article articles = new Article
{
Author = "野比大雄",
Title = "多拉A夢快拿出節目不會被NCC禁播的道具",
Content = @"原始資料",
PostOn = DateTime.Now
};
// 來自於ExternalBullerin中下的Attribute
SilencerAttribute attr = bulletin.GetType().GetCustomAttribute<SilencerAttribute>();
// 針對Model做判斷
switch (attr.Mode)
{
case SilencerMode.Normal:
articles.Author = "野比OO";
articles.Title = "多拉OO快拿出節目不會禁播的道具";
articles.Content = @"只顯示二個名字";
break;
case SilencerMode.Strict:
articles.Author = "OOOO";
articles.Title = "OOOO快拿出節目不會禁播的道具";
articles.Content = @"把名字全部碼掉";
break;
default:
throw new ArgumentOutOfRangeException();
}
return articles;
}
}
四、建立抽象類別,由此類別中取得Article的資料
(如果要從外部帶入資料,這邊的建構子傳入的參數就可以做修改)
public abstract class Bulletin
{
protected Bulletin()
{
ArticlesFactory articlesFactory = new ArticlesFactory();
Article = articlesFactory.CreateArticles(this);
}
public Article Article { get; set; }
public string Description { get; set; }
}
五、建立子類別,其中SilencerMode.Normal就是在第三點中,所取得的類型。
[Silencer(Mode = SilencerMode.Normal)]
public class ExternalBullerin : Bulletin
{
public ExternalBullerin()
{
Description = "碼掉二個字";
}
public string ExternalProperty { get; set; }
}
六、傳回資料
public ActionResult External()
{
ExternalBullerin ex = new ExternalBullerin();
return View(ex);
}
七、由於是用MVC在寫的,所以把View部分也一併放上
@model Bulletin
@Html.DisplayFor(model => model.Article.Title)
這邊主要是用Bulletin把資料帶出來,並非Article唷!
完成的資料呈現
如果把第五點的Model改為SilencerMode.Strict
資料則會變成
歡迎您的加入,讓這個社群更加美好!