首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> 關於ASP.NET

ASP.NET MVC ModelMetadata 客製化:UIHintAttribute 指定模板與多重特性選擇策略

     編輯:關於ASP.NET

UIHintAttribute 透過 ModelMetadata.TemplateHint 指定模板名稱,支援 PresentationLayer 區分呈現層(HTML、Silverlight、WPF 等)。本文詳細說明屬性定義、多重特性選擇邏輯與實測驗證。

一、UIHintAttribute 定義與 TemplateHint

[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, AllowMultiple=true)]
public class UIHintAttribute : Attribute
{
    public string UIHint { get; }           // 模板名稱
    public string PresentationLayer { get; } // 呈現層類型
    public UIHintAttribute(string uiHint);
    public UIHintAttribute(string uiHint, string presentationLayer);
}

ModelMetadata.TemplateHint 對應 UIHint 屬性值,決定模板搜尋名稱。

二、多重 UIHintAttribute 選擇策略

  1. 優先選擇 PresentationLayer == "MVC"(不分大小寫)的特性
  2. 若無,選擇 PresentationLayer == null/Empty 的特性
  3. 若仍有多個符合,取反射取得的第一個(順序不保證與宣告順序一致)

三、實測驗證程式碼

public static ModelMetadata GetModelMetadata<TModel>(string propertyName)
{
    var provider = ModelMetadataProviders.Current;
    var container = new ModelMetadata(provider, null, () => null, typeof(TModel), null);
    return container.Properties.FirstOrDefault(m => m.PropertyName == propertyName);
}

public class Model
{
    public string Foo { get; set; }
    [UIHint("Template A")]
    [UIHint("Template B", "Mvc")]
    public string Bar { get; set; }
    [UIHint("Template A")]
    public string Baz { get; set; }
}

// 測試輸出
Console.WriteLine("Foo: " + (GetModelMetadata<Model>("Foo").TemplateHint ?? "N/A")); // N/A
Console.WriteLine("Bar: " + (GetModelMetadata<Model>("Bar").TemplateHint ?? "N/A")); // Template B
Console.WriteLine("Baz: " + (GetModelMetadata<Model>("Baz").TemplateHint ?? "N/A")); // Template A

結果完全符合選擇策略:Bar 選擇 PresentationLayer="Mvc" 的 Template B;Baz 單一特性直接使用 Template A。

四、最佳實踐建議

  • 明確指定 PresentationLayer="MVC" 避免歧義
  • 2. 避免同屬性套用多個無 PresentationLayer 的 UIHint 3. 模板命名建議使用有意義的業務名稱而非型別名稱
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved