IMetadataAware 介面讓特性在 ModelMetadata 建立後介入修改,是客製化中繼資料的核心擴展點。MVC 內建兩個實作:AdditionalMetadataAttribute(增加額外值)與 AllowHtmlAttribute(關閉 HTML 請求驗證)。本文詳細解析機制與實戰驗證。
public interface IMetadataAware
{
void OnMetadataCreated(ModelMetadata metadata);
}
流程:ModelMetadata 建立 → 套用 DataAnnotations 特性初始化 → 篩選實作 IMetadataAware 的特性 → 呼叫 OnMetadataCreated 允許修改最終中繼資料。
[AttributeUsage(AttributeTargets.Property, AllowMultiple=false, Inherited=true)]
public sealed class AllowHtmlAttribute : Attribute, IMetadataAware
{
public void OnMetadataCreated(ModelMetadata metadata)
{
metadata.RequestValidationEnabled = false;
}
}
ModelMetadata.RequestValidationEnabled 預設 true,啟用 ASP.NET 請求驗證(攔截含 HTML 標記的輸入)。AllowHtmlAttribute 將其關閉,允許該屬性接收 HTML 內容。
public class Foo
{
public string Bar { get; set; }
[AllowHtml] public string Baz { get; set; }
}
public class HomeController : Controller
{
public ActionResult Index(Foo foo) { return View(foo); }
}
@model Foo
@Html.EditorForModel()
瀏覽 /Home/Index?Bar=<script/>&Baz=<script/>:
AllowHtml,請求驗證攔截,拋出 HttpRequestValidationExceptionAllowHtml,正常繫結顯示 <script/> 於文字框
富文本編輯器(CKEditor、TinyMCE)輸入內容、需儲存 HTML 片段的欄位、信任內部用戶輸入的後台管理介面。謹慎使用,避免 XSS 風險。