2017-05-31 69 views
0

我正在使用MVC 3並使用資源文件來本地化應用程序。現在我們有另一位客戶登錄該應用程序,他們想要更改應用程序中的一些文本。mvc視圖中的條件命名空間

我必須爲他們創建一個分隔的資源文件,並願意做這樣的事情的看法

如果(客戶= A) @using Resources.customerA 其他 @using Resources.customerB

我在兩個命名空間資源類,所以如果我更改命名空間是這樣工作正常

Resource.WelcomeUser

可以在視圖中使用條件使用語句嗎?我無法找到正確的語法。有任何想法嗎?

+0

對不起,我忘記提及資源文件的類名對於所有客戶都是一樣的。我只爲每個類創建了一個不同的命名空間,因爲大部分代碼已經寫好了,並且我希望這些代碼在視圖中保持一致,並且不想在任何地方改變它。 這是我的代碼是如何構建的。 命名空間resources.customerA { 類資源 {} } 命名空間resources.customerB { 類資源 {} } 我 –

+0

做了這種方式,因爲在意見我已經有語法像 Resource.WelcomeUser,我不想在任何地方改變,所以我想如果我只是改變命名空間的東西會起作用,但如果我在設計時更改命名空間,它們實際上是可行的。 –

回答

0

你可以在View中同時使用兩個語句,但是當你使用類時你必須寫一些名稱空間前綴。 例子:

@using Project.Resources.customerA 
@using Project.Resources.customerB 

使用類:

customerA.WelcomeUser 
customerB.WelcomeUser 

我覺得有沒有別的辦法,因爲兩個文件不能有相同的路徑。

0

你真正在談論的是提供者模式。你有兩個(或更多)可互換的東西,並且你希望能夠使用其中一個或另一個上下文。

在OO上下文中執行此操作的正確方法是創建並使用接口,然後在運行時注入實際實現。實際上,你可以在ASP.NET Core中實現這一點,它支持Views中的注入,但在ASP.NET MVC 5和之前的版本中,你需要稍微偏離自己的方向。我想象這些目前是靜態類,因爲你只是通過命名空間來引用它們。有了這種方法,你需要關注@ Ssheverdin的意見,並使用類(即與命名空間)的FQN:

@if (customer == A) 
{ 
    @Resources.customerA.StaticClass.Property 
} 
else 
{ 
    @Resources.customerB.StaticClass.Property 
} 

或者,你可以改變靜態類是實例類,並使用一個工廠模式返回正確的一個。這是一個非常簡單的例子,但希望足以傳達的理念:通過視圖文件夾下添加一個web.config文件,包括

@{ var resource = ResourceFactory.GetForCustomer(customer); } 
0

我已成功地實現行爲:

public static class ResourceFactory 
{ 
    public static IResourceClass GetForCustomer(string customer) 
    { 
     switch (customer) 
     { 
      case "A": 
       return new Resources.customerA.ResourceClass(); 
      default: 
       return new Resources.customerB.ResourceClass(); 
     } 
    } 

然後那裏的命名空間,我必須從所有視圖中刪除@using語句。您可能會發現智能感知不再適用於您,因此請嘗試關閉所有視圖並重新打開它們。

通過這種方式,我可以爲每個客戶創建一個單獨的web.config文件,並相應地指定相關的命名空間。現在只需要確保在部署版本時爲每個客戶提供正確的配置文件:)