2012-05-21 75 views
0

我剛開始玩WebPages(Razor),我想出了牆背後的一些基本概念。首先,我列出我始終都對事情我建立每個站點:當然ASP.NET WebPages翻譯和模板概念

  • 友好的URL(網頁做到這一點對我來說)
  • 翻譯的URL(網頁支持參數,以便其易於管理)
  • 多模板支撐(網頁默認情況下不支持,在這裏需要一些邏輯)
  • 每個功能以避免重複分居代碼(網頁支持它背後的牆上)

所以,如果你想ABOV列出良好的舊MVC模式發揮作用。 ASP.NET已經有了一個MVC(3)框架,它提供了我需要的所有功能。我很清楚。在這個問題上,我試圖弄清WebPages技術是否也是開發大型MVC(類似)web項目的完美平臺。

我測試了WebPages的頁面加載行爲/鏈,並找出它真的是一個由加載頁面和一個或多個嵌套佈局構建的鏈。每個佈局頁面都有一個指向其加載器(父)頁面的指針。

在這一點上,我必須明確一些基本概念。由於WebPages通過物理文件和文件夾(路徑)解析urls間接支持,因爲我可以通過使用這樣的路徑創建翻譯的文件夾和文件:..../en/account/register,我可以創建另一個路徑,例如匈牙利語言路徑:.../hu/szemelyes/regisztracio。

所有我需要的是分離代碼,因爲它不那麼優雅,寫寄存器邏輯到兩個.cshtml文件。 WebPages支持@helpers和@functions,因此很容易創建一個「Account.cshtml」並創建我需要的所有功能。它是我的問題的正式答案。

如果我在某個.cshtml(幫助程序)文件中寫了@function,牆背後會發生什麼?它爲我創建了一個繼承WebPageHelper的新類。我認爲這不是太優雅的方式,因爲我可以創建自己的類來提供相同的功能。

一些進一步的研究我發現每個頁面(和佈局頁面)都默認繼承WebPage類。使用@inherits指令,我可以重寫默認繼承,並且可以完美地創建我自己的從WebPage派生的類,並且可以直接從該頁面繼承我的所有.cshtml文件。

在這一點上,我可以分開代碼(我認爲:)比使用@functions更優雅的方式。關於文本翻譯呢?我認爲它是一種使用資源文件的通用方式,但使用WebPages時,我想要將文本值存儲在普通的.cshtml文件中。你怎麼看待這件事?

最後我register.cshtml:

@inherits Account.Register 
@{ 
    Title = "Please Register" 
} 

..和我regisztracio.cshtml:

@inherits Account.Register 
@{ 
    Title = "Kérem regisztráljon" 
} 

我Account.Register類有一個字符串屬性名稱:

public class Register : WebPage 
{ 
    public String Title { get; set; } 
    ... 
} 

還有一件事我必須告訴。我的register.cshtml(以及regisztracio.cshtml)不包含任何html標記。我有一個默認的佈局文件(_Master.cshtml),我有另一個佈局文件爲每個頁面(_Register。cshtml)在我的「查看」目錄下。我的代碼通過我加載的「控制器」類的名稱自動加載正確的頁面佈局文件。所以我的Register類會自動加載「_Register.cshtml」佈局文件。所有頁面佈局文件都會自動加載_Master.cshtml(或_Mobile.cshtml,如果訪客使用移動設備),這是主佈局。

所以我認爲這是一個爲WebPages技術實現的MVC模式,同時保持WebPages強大的功能,如自動url解析。

您認爲如何?

所以其我與網頁

回答

0

基本概念,我敢肯定,你得到更多的接觸到你會引入其他做法的框架。至於語言翻譯,您可以使用文化設置和資源文件。 您可以通過global.asax根據查詢參數設置當前的文化設置。

初始化區域性設置的例子:

CultureInfo ci = new CultureInfo("en-US"); 
Thread.CurrentThread.CurrentCulture = ci; 
Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture(ci.Name); 

那麼你的解決方案將無縫地利用資源字符串,而不是文字字符串,使你的代碼更加清晰和強類型。在你的情況下,它也將避免有兩個單獨的註冊視圖。

@inherits Account.Register 
@{ 
    Title = StringsResource.RegisterTitle 
} 

根據文化背景,標題變量將舉行無論是「請註冊」文本或「凱雷姆regisztráljon」。

祝你好運!

+0

是的,如果我使用傳統的資源文件,我不需要兩個或更多語言特定的頁面文件進行翻譯。但我仍然需要這兩個或更多頁面文件來進行網址翻譯。如果我只保留一個頁面文件並使用cultureinfo和資源文件,我該如何翻譯url? WebPages已經有了一個基於路徑的URL路由,所以我認爲可以很容易地爲它構建我的概念來進行網址翻譯。然後,我仍然需要爲每種語言分開的頁面文件。然後這些文件將適用於存儲特定於語言的文本。 – ggabor

+0

您可以創建將用戶轉發到相同視圖但具有不同URL的路由。看着你的代碼,你有一個叫做帳戶和視圖的控制器叫做寄存器。默認路由可以是相同的。要訪問匈牙利的路線,你應該有這樣的:'routes.MapRoute(「RegisterAccountHungarian」,「szemelyes/regisztracio/{id}」,新{控制器=「帳戶」,動作=「註冊」,ID = UrlParameter。可選});'你需要添加語言參數。 – Igorrious

+0

如果我這樣做,我必須爲每個翻譯的文件夾和文件創建MapRoute。使用WebPages,它已經通過基於路徑的默認路由引擎完成了。我知道MVC3是如何工作的。在這裏,我嘗試爲WebPages框架明確構建一個新概念。所以我不想使用MapRoute功能。我嘗試基於簡單的文件路徑 - 文件夾和文件構建我的解決方案。我期待的是這種WebPages技術的最佳理想方法。不適用於MVC3框架。 – ggabor