2013-06-24 1 views
17

Pourquoi est-il impossible d'utiliser une variable statique à partir d'une classe statique dans une vue?Utilisation de variables statiques dans Razor

Par exemple, disons que vous avez une classe Réglages:

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

Pourquoi ne pas être en mesure de l'appeler dans une vue?

comme si

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

Répondre

10

Pour autant que je sache, vous pouvez l'accès des variables statiques de l'intérieur d'une vue dans ASP.NET MVC, si vous incluez la classe espace de noms avec l'instruction appropriée using :

@using WhateverNamespaceGlobalVariablesIsIn 

Plus important encore, vous ne devriez pas accéder aux variables statiques directement à partir de vues. Conformément au modèle MVC, toutes les données de votre point de vue devrait être accessible dans votre modèle de vue:

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

Vue:

@model MyViewModel 

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

Si vous devez faire ceci dans votre fichier de mise en page, vous pouvez utiliser RenderAction pour appeler une action du contrôleur et retourner une vue partielle à la place. Le partiel peut alors être tapé à MyViewModel, qui peut être utilisé comme ci-dessus.

+0

Donc, vous ne devriez pas en raison de se conformer au modèle MVC? est-ce la raison principale pourquoi? – ChaoticLoki

+0

Autant que je sache, vous pouvez * utiliser * des variables statiques dans les vues tant que vous incluez l'espace de noms de la classe avec '@ using'. Vous ne devriez pas, cependant. –

+0

Très bien, ça a du sens, je ne voulais pas avoir à créer des viewmodels pour tout, même quand je ne passais pas un viewmodel. Comme par exemple, j'ai une liste de clients qui vient de passer une liste de modèles de clients. – ChaoticLoki

7

votre classe mondiale devrait être comme

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

et la page @AppName .GlobalVariables.SystemColor appname remplacer par espace de noms de classe mondiale

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

Cela devrait être la réponse acceptée. Simple et précis. –

5

Vous pouvez accéder à des variables statiques la vue. Il y a trois façons de le faire:

1) Comme le suggère Ant P, inclure l'instruction dans la vue. Étant donné que l'espace de noms de la classe GlobalVariables est AppName.GlobalVariables:

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

2) Une autre façon est d'utiliser directement l'espace de noms dans la ligne où vous voulez à la variable d'accès:

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

3) Enfin, vous pouvez ajouter l'espace de noms nécessaire au fichier web.config sous le dossier Views:

<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> 

Quant à la coller la variable dans le modèle et le passage à la vue de là ... En effet, il est conforme au modèle MVC et assure la séparation des préoccupations et tout ce que la bonté. Mais à mon avis, dans certains cas, le fait de rester fidèle au modèle est considéré comme absurde. Dans votre cas, j'accéderais simplement à cette variable depuis la vue.

Questions connexes