動手DIY改造 Asp.net MVC- 擴充在擴充,強化WebViewPage製作多國貨幣機制 (第29天)

Agenda

前言

View頁面(razor,aspx…)都是繼承WebViewPage<TModel>頁面,

今天會帶大家寫一個範例完成透過Route判斷多國錢幣符號.

多國路由設定

Route設定上多一個{culture}區塊.如果使用者沒有輸入預設使用英文(en).

1
2
3
4
routes.MapRoute(
name: "Default",
url: "{culture}/{controller}/{action}",
defaults: new { controller = "Home", action = "Index", culture = "en" });

取得貨幣符號

建立一個介面ICurrency裡面有個方法可以取得傳入國家貨幣符號.

CurrencyProvider類別透過Routes.Values["culture"]取得使用者傳遞語系國家.

透過此參數可以知道使用者想要使用哪個國家貨幣.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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 "$";
}
}
}

擴充 WebViewPage

Autofac多註冊一個

1
2
builder.RegisterType<CurrencyProvider>().As<ICurrency>();
DependencyResolver.SetResolver(new CustomerDependencyResolver(builder.Build()));

最後在建立一個CountryViewPage<TModel>抽象類別繼承於WebViewPage<TModel>.

在此類別中建立一個ICurrency屬性,並在建構子中透過DependencyResolver.Current.GetService給值

因為這間已經替換成Autofac解析器,所以會吃Autofac註冊的類別.

1
2
3
4
5
6
7
8
public abstract class CountryViewPage<TModel> : WebViewPage<TModel>
{
public CountryViewPage()
{
Currency = DependencyResolver.Current.GetService<ICurrency>();
}
public ICurrency Currency { get; }
}

RazorView使用擴充後WebViewPage

View上使用新WebViewPage<TModel>只需要在最上面加@inherits CountryViewPage<object>.
我們就可以透過@呼叫Currency物件.

1
2
3
4
5
6
7
8
9
10
@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#程式碼繼承於此類別

1
2
3
4
5
6
7
8
9
10
<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分支上

此文作者:Daniel Shih(石頭)
此文地址https://isdaniel.github.io/ithelp-day29/
版權聲明:本博客所有文章除特別聲明外,均採用 CC BY-NC-SA 3.0 TW 許可協議。轉載請註明出處!


如果本文對您幫助很大,可街口支付斗內鼓勵石頭^^