2013-06-24 16 views
17

Dlaczego nie jest możliwe użycie statycznej zmiennej z klasy statycznej w widoku?Używanie zmiennych statycznych w maszynce do golenia

Na przykład, powiedzmy, że masz Klasa Ustawienia:

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

Dlaczego nie można nazwać w widoku?

jak tak

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

Odpowiedz

10

O ile mi wiadomo, pan może zmienne dostęp statyczne od wewnątrz widoku w ASP.NET MVC, jeśli zawierają klasy nazw z odpowiednim oświadczeniem using :

@using WhateverNamespaceGlobalVariablesIsIn 

Co ważniejsze, nie powinieneś uzyskiwać dostępu do zmiennych statycznych bezpośrednio z widoków. Zgodnie z wzorca MVC, wszystkie dane Państwa zdaniem powinny być dostępne w modelu Widok:

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

Widok:

@model MyViewModel 

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

Jeśli trzeba to zrobić w pliku układu, można wykorzystać RenderAction, aby wywołać działanie kontrolera i zamiast niego wyświetlić widok częściowy. Częściowe mogą być następnie wpisane jako MyViewModel, które mogą być używane jak wyżej.

+0

Więc nie powinieneś z powodu dostosowania do wzoru MVC? czy to główny powód? – ChaoticLoki

+0

O ile mi wiadomo, możesz * używać * zmiennych statycznych w widokach, o ile uwzględnisz przestrzeń nazw klasy za pomocą '@ using'. Ale nie powinieneś. –

+0

W porządku, to ma sens, po prostu nie chciałem tworzyć modeli podglądu dla wszystkiego, nawet gdy nie przekazywałem widoku. Na przykład mam listę klientów, która właśnie przekazała listę modeli klientów. – ChaoticLoki

7

Twój globalny klasa powinna być jak

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

i na stronie @NazwaAp .GlobalVariables.SystemColor appname zastąpić nazw światowej klasy

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

To powinna być zaakceptowana odpowiedź. Prosto i do rzeczy. –

5

Można uzyskać dostęp do zmiennych statycznych w widok. Można to zrobić na trzy sposoby:

1) Zgodnie z sugestią Ant Pala, dołącz wyrażenie w widoku. Biorąc pod uwagę, że przestrzeń nazw klasy GlobalVariables jest AppName.GlobalVariables:

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

2) Innym sposobem jest bezpośrednio używać nazw w wierszu, w którym chcesz mieć dostęp do zmiennej:

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

3) Na koniec można dodać wymaganą przestrzeń nazw do pliku web.config w folderze Widoki:

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

Jeśli chodzi o trzymanie zmiennej w modelu i przekazaniem go do Widok stamtąd ... rzeczywiście jest on zgodny z wzorca MVC i zapewnia oddzielenie obawy i wszystko, dobroci. Ale moim zdaniem w niektórych przypadkach "trzymanie się wzorca" zostaje doprowadzone do poziomu absurdu. W twoim przypadku chciałbym uzyskać dostęp do tej zmiennej z widoku.

Powiązane problemy