2013-06-24 299 views
17

爲什麼從視圖中的靜態類使用靜態變量是不可能的?在剃刀中使用靜態變量

例如,假設你有一個設置類:

public static class GlobalVariables 
{ 
    public static string SystemColor 
    { 
     get { return Properties.Settings.Default.SystemColor; } 
    } 
} 

你爲什麼不能夠調用它的觀點?

像這樣

@using AppName.Models 
<html> 
<div ><h1 style="color:@GlobalVariables.SystemColor">System Color</h1></div> 
</html> 

回答

10

據我所知,你可以在ASP.NET MVC中,視圖內訪問靜態變量如果包括與適當的using聲明類的命名空間:

@using WhateverNamespaceGlobalVariablesIsIn 

更重要的是,你不應該直接從視圖訪問靜態變量。在與MVC模式,你的所有視圖的數據應該在你的視圖模型訪問:

public ActionResult MyAction() 
{ 
    var model = new MyViewModel(); 
    model.SystemColor = GlobalVariables.SystemColor; 
    ... 
    return View(model); 
} 

查看:

@model MyViewModel 

<div> 
    <h1 style="color:@(Model.SystemColor)">System Color</h1> 
</div> 

如果你需要做到這一點在你的佈局文件,你可以使用RenderAction來調用控制器操作並返回部分視圖。然後部分可以輸入到MyViewModel,可以像上面那樣使用。

+0

所以你不應該因爲符合MVC模式?主要原因是什麼? – ChaoticLoki

+0

據我所知,只要用'@ using'包含類的命名空間,就可以在視圖中使用靜態變量。不過,你不應該這樣做。 –

+0

好吧,這很有道理,即使我沒有傳遞視圖模型,我也不想爲所有事情創建視圖模型。例如,我有一個客戶列表,剛剛通過了一個客戶模型列表。 – ChaoticLoki

7

全局類應該像

public class GlobalVariables 
{ 
    public static string SystemColor 
    { 
     get { return Properties.Settings.Default.SystemColor; } 
    } 
} 

和頁@AppName的 .GlobalVariables.SystemColor APPNAME全球類的命名空間

@using AppName.Models 
<html> 
<div ><h1 style="color:@AppName.GlobalVariables.SystemColor">System Color</h1></div> 
</html> 
</p> 
+0

這應該是被接受的答案。簡單而重要。 –

5

您可以訪問靜態變量替換風景。有三種方法:

1)由於Ant P建議,在視圖中包含using語句。鑑於GlobalVariables類的命名空間是AppName.GlobalVariables

@using AppName.GlobalVariables 
<html> 
    <div ><h1 style="color:@GlobalVariables.SystemColor">System Color</h1></div> 
</html> 

2)另一種方法是直接使用的命名空間中的線,你要訪問的變量:

<div ><h1 style="color:@AppName.GlobalVariables.SystemColor">System Color</h1></div> 

3 )最後,您可以將所需的名稱空間添加到Views文件夾下的web.config文件中:

<system.web.webPages.razor> 
    <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> 
    <pages pageBaseType="System.Web.Mvc.WebViewPage"> 
    <namespaces> 
     <add namespace="System.Web.Mvc" /> 
     <add namespace="System.Web.Mvc.Ajax" /> 
     <add namespace="System.Web.Mvc.Html" /> 
     <add namespace="System.Web.Routing" /> 
     <add namespace="System.Web.Optimization" /> 
     <add namespace="AppName.GlobalVariables" /> 
    </namespaces> 
    </pages> 
</system.web.webPages.razor> 

至於變量在模型中堅持並將它傳遞給視圖從那裏......的確符合MVC模式,並確保的擔憂和所有善良的分離。但在我看來,在某些情況下,「堅持模式」被拿到了荒謬的層面。在你的情況下,我只是從視圖中訪問這個變量。