View
頁面(razor
,aspx
...)都是繼承WebViewPage<TModel>
頁面,
今天會帶大家寫一個範例完成透過Route
判斷多國錢幣符號.
在Route
設定上多一個{culture}
區塊.如果使用者沒有輸入預設使用英文(en
).
routes.MapRoute(
name: "Default",
url: "{culture}/{controller}/{action}",
defaults: new { controller = "Home", action = "Index", culture = "en" });
建立一個介面ICurrency
裡面有個方法可以取得傳入國家貨幣符號.
在CurrencyProvider
類別透過Routes.Values["culture"]
取得使用者傳遞語系國家.
透過此參數可以知道使用者想要使用哪個國家貨幣.
public interface ICurrency
{
string GetCurrencySymbol();
}
public class CurrencyProvider : ICurrency
{
public string GetCurrencySymbol()
{
HttpContextBase contextWrapper = new HttpContextWrapper(HttpContext.Current);
string culture = RouteTable.Routes.GetRouteData(contextWrapper)?.Values["culture"] as string;
return GetSymbol(culture);
}
private string GetSymbol(string culture)
{
switch (culture)
{
case "en":
return "$";
case "eu":
return "£";
default:
return "$";
}
}
}
在Autofac
多註冊一個
builder.RegisterType<CurrencyProvider>().As<ICurrency>();
DependencyResolver.SetResolver(new CustomerDependencyResolver(builder.Build()));
最後在建立一個CountryViewPage<TModel>
抽象類別繼承於WebViewPage<TModel>
.
在此類別中建立一個ICurrency
屬性,並在建構子中透過DependencyResolver.Current.GetService
給值
因為這間已經替換成
Autofac
解析器,所以會吃Autofac
註冊的類別.
public abstract class CountryViewPage<TModel> : WebViewPage<TModel>
{
public CountryViewPage()
{
Currency = DependencyResolver.Current.GetService<ICurrency>();
}
public ICurrency Currency { get; }
}
在View
上使用新WebViewPage<TModel>
只需要在最上面加@inherits CountryViewPage<object>
.
我們就可以透過@
呼叫Currency
物件.
@inherits CountryViewPage<object>
@{
ViewBag.Title = "About";
}
<h2>@ViewBag.Title.</h2>
<h3>@ViewBag.Message @Currency.GetCurrencySymbol()</h3>
<p>Use this area to provide additional information.</p>
如果每個頁面都需要使用新的WebViewPage<TModel>
可以透過web.config
新增加一個<pages pageBaseType="CountryViewPage">
將Razor
產生的C#
程式碼繼承於此類別
<system.web.webPages.razor>
<pages pageBaseType="CountryViewPage">
<namespaces>
<add namespace="System.Web.Mvc" />
<add namespace="System.Web.Mvc.Ajax" />
<add namespace="System.Web.Mvc.Html" />
<add namespace="System.Web.Routing" />
</namespaces>
</pages>
</system.web.webPages.razor>
其實我們也可以繼承WebViewPage<TModel>
來擴充View
多變性
這邊有一個題目提供讀者來完成透過上面概念完成多國語系,這裡提供一條方法完成
寫一個
string transfer(string key)
透過Resource
檔案來完成;
Github範例程式原始碼 CustomerWebViewPage
分支上