2013-04-16 7 views
6

è possibile accedere alle mie proprietà del progetto all'interno del file .cshtml Razor? Ho bisogno di qualcosa di simile:come accedere alle proprietà del progetto in un file del rasoio .cshtml?

@if (myProject.Properties.Settings.Default.foo) {...} 

mentre foo è un boolean

ottengo l'errore che a causa di un motivo di sicurezza non è possibile.

+1

Che ne dici di impostare quella proprietà nel ViewBag (nel Controller) e chiamarla da lì? –

+0

Buona idea, lo proverò – gurehbgui

+0

ma il problema è che questa è la mia pagina _Layout, dove ho il Viewbag? Non lo imposterò in ogni singolo controller che ho – gurehbgui

risposta

10

Non si dovrebbe davvero essere chiamata direttamente da ConfigurationManager il tuo punto di vista. Le viste dovrebbero essere "stupide" in MVC, ovvero non avere alcuna conoscenza della struttura dati o del back-end, e chiamando lo ConfigurationManager direttamente la tua vista sa troppo su come le tue impostazioni sono memorizzate. Se hai cambiato le tue impostazioni per utilizzare un negozio diverso (ad esempio un database), allora dovresti cambiare la tua vista.

Quindi, dovresti prendere quel valore altrove e passarlo alla tua vista in modo che la tua vista si occupi solo di renderlo e basta. Probabilmente avete 2 opzioni:

  1. Aggiungi qualcosa nella ViewBag e afferrarlo nella vista
  2. Render un'azione da un controller comune che passa un ViewModel fortemente tipizzato ad una visione parziale.

mi piacerebbe scoraggiare l'opzione 1 perché in generale è bene evitare il ViewBag perché non è fortemente tipizzato (Is using ViewBag in MVC bad?). Inoltre, per fare questo dovresti ereditare da uno BaseController per ogni controller che può essere doloroso, oppure creare un filtro di azione globale che sovrascrive lo ActionExecuted e inserisce qualcosa nello ViewBag lì.

L'opzione 2 è probabilmente migliore. Mi piacerebbe creare un qualcosa di controllo comune come:

public class CommonController : Controller 
{ 
    [ChildActionOnly] 
    public ViewResult Settings() 
    { 
     // Get some config settings etc here and make a view model 
     var model = new SettingsModel { Foo = myProject.Properties.Settings.Default.foo }; 

     return View(model); 
    } 
} 

Poi, nel tuo file di layout è possibile chiamare:

@Html.Action("Settings", new { controller = "Common" }) 

che rende una vista parziale fortemente tipizzato (~/Vista/common/Impostazioni. cshtml) che si presenta come:

@model YourProject.Models.SettingsModel 

@if(Model.Foo) 
{ 
    // So something 
} 

In questo modo si sta ancora utilizzando un modello fortemente tipizzato e vista, la visualizzazione di layout rimane pulito e semplice e la vostra visione parziale resta 'muto'

+0

cosa succede se è necessario nella vista _Layout? –

+0

Funziona ancora: basta chiamare l'azione dalla vista layout e sarà inclusa –

0

Le impostazioni dell'applicazione sono memorizzate nel file web.config come

<applicationSettings> 
<YourProject.Properties.Settings> 
    <setting name="Setting" serializeAs="String"> 
    <value>asdqwe</value> 
    </setting> 

modo da poter provare uso ConfigurationManager.AppSettings dictionary come

ConfigurationManager.AppSettings["Setting"] 
+0

Poi ho un errore che il "ConfigurationManager" non è disponibile in questo contesto – gurehbgui

+1

Si dovrebbe leggere configurationmanager nel controller perché non è il lavoro della pagina di layout per farlo. L'unico scopo della pagina di layout è di rendere i valori che gli vengono dati. Fornire valori da visualizzare è responsabilità del controllore. –

+0

Controlla [questo] (http://stackoverflow.com/questions/11395118/how-to-use-properties-settings-default-in-script-layout-cshtml). E ConfigurationManager dovrebbe essere disponibile sulle viste. – lavrik

Problemi correlati