本系列第三篇著重於實作自訂表達式建構器 ExternalResourceExpressionBuilder,支援新前綴 ExternalResource 的宣告式資源繫結語法,使開發者能從外部組件資源檔透過標準表達式語法存取全域資源。
<%$ ExternalResource: [assemblyName]|[resourceType], [resourceKey] %>
範例:<%$ ExternalResources:CommonResources|CommonTerms, Hello %>
| 方法 | 功能說明 |
|---|---|
EvaluateExpression | 非編譯頁面中回傳資源值 |
GetCodeExpression | 回傳編譯期生成的程式碼片段,呼叫 GlobalExternalResourceProvider |
ParseExpression | 剖析驗證表達式參數,資源不存在則拋出例外導致頁面剖析失敗 |
SupportsEvaluate | 屬性,回傳 true 表示支援非編譯頁面評估 |
public override object ParseExpression(string expression, Type propertyType, ExpressionBuilderContext context)
{
if (string.IsNullOrEmpty(expression))
throw new ArgumentException(...);
string[] expParams = expression.Split(',');
if (expParams.Length != 2)
throw new ArgumentException(...);
string classKey = expParams[0].Trim();
string resourceKey = expParams[1].Trim();
var fields = new ExternalResourceExpressionFields(classKey, resourceKey);
EnsureResourceProviderFactory();
IResourceProvider rp = s_resourceProviderFactory.CreateGlobalResourceProvider(fields.ClassKey);
object res = rp.GetObject(fields.ResourceKey, CultureInfo.InvariantCulture);
if (res == null)
throw new ArgumentException($"找不到資源: {fields.ResourceKey}");
return fields;
}
ParseExpression 在頁面剖析階段(設計時、編譯前)執行,確保資源鍵存在、類型正確,提早發現錯誤,避免執行期驚喜。
<asp:Label ID="labExternalResource" runat="server"
Text="<%$ ExternalResources:CommonResources|CommonTerms, Hello %>"
meta:localize="false" />
ResourceProviderFactory 架構,無縫整合。此實作完成了從資料庫資源儲存、自訂提供者工廠、到表達式建構器的完整擴充鏈,賦予 ASP.NET 2.0 企業級本地化彈性。