2013-04-16 2 views
6

ist es möglich, auf meine Projekteigenschaften innerhalb der .cshtml Razor-Datei zuzugreifen? Ich brauche etwas wie folgt aus:Wie Sie auf die Projekteigenschaften in einer .cshtml-Datei zugreifen können?

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

während foo ein boolean

ist ich den Fehler, dass aufgrund eines Sicherheits Grund, warum es nicht möglich ist.

+1

Wie wäre es, diese Eigenschaft im ViewBag (im Controller) zu setzen und von dort aus aufzurufen? –

+0

Gute Idee, werde es versuchen – gurehbgui

+0

aber das Problem ist, dass dies meine _Layout Seite ist, wo habe ich den Viewbag dafür? Ich werde es nicht in jedem einzelnen Controller setzen, den ich habe – gurehbgui

Antwort

10

Sie sollten nicht wirklich ConfigurationManager aus direkt aufrufen werden versuchen gespeichert deine Ansicht. Ansichten sollten in MVC "dumm" sein, dh keine Kenntnisse über die Datenstruktur oder das Backend haben, und durch Aufruf von ConfigurationManager weiß Ihre Ansicht zu viel darüber, wie Ihre Einstellungen gespeichert werden. Wenn Sie Ihre Einstellungen so geändert haben, dass sie einen anderen Speicher (z. B. eine Datenbank) verwenden, müssen Sie Ihre Ansicht ändern.

Also, Sie sollten diesen Wert woanders nehmen und es an Ihre Ansicht übergeben, so dass Ihre Ansicht nur für das Rendern sorgt und das ist es. Sie haben wahrscheinlich zwei Optionen:

  1. etwas in die ViewBag hinzufügen und es in der
  2. Render eine Aktion aus einer gemeinsamen Steuerung Ansicht zu ergreifen, die ein stark typisierte Viewmodel auf eine Teilansicht gelangt.

würde ich Option 1 entmutigen, denn in der Regel ist es gut, die ViewBag zu vermeiden, weil sie nicht stark typisiert ist (Is using ViewBag in MVC bad?). Dazu müßtest du entweder von einem BaseController für jeden Controller erben, der ein Schmerz sein kann, oder einen globalen Aktionsfilter erstellen, der ActionExecuted überschreibt und etwas in den ViewBag steckt.

Option 2 ist wahrscheinlich besser. Ich würde eine gemeinsame Steuerung so etwas wie erstellen:

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); 
    } 
} 

Dann in Ihrem Layout-Datei können Sie anrufen:

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

, die eine stark typisierte Teilansicht rendert (~/Ansichten/Common/Einstellungen. cshtml), die wie folgt aussieht:

@model YourProject.Models.SettingsModel 

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

diese Weise können Sie immer noch eine stark typisierte Modell und Ansicht sehen Sie die Layout-Ansicht bleibt sauber und einfach und Ihre Teilansicht bleibt ‚stumm‘

+0

Was ist, wenn dies in der Ansicht _Layout benötigt wird? –

+0

Dies funktioniert immer noch - rufen Sie einfach die Aktion aus Ihrer Layout-Ansicht und es wird enthalten sein –

0

Die App-Einstellungen werden in der Datei web.config als

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

so können Sie verwenden ConfigurationManager.AppSettings dictionary wie

ConfigurationManager.AppSettings["Setting"] 
+0

Dann bekomme ich einen Fehler, dass der "ConfigurationManager" in diesem Kontext nicht verfügbar ist – gurehbgui

+1

Sie sollten configurationmanager in Controller lesen, da es nicht die Aufgabe der Layoutseite ist, dies zu tun. Der einzige Zweck der Layout-Seite ist es, die Werte, die sie erhalten, zu rendern. Die Bereitstellung von Werten für die Anzeige liegt in der Verantwortung des Controllers. –

+0

Überprüfen Sie [diese] (http://stackoverflow.com/questions/11395118/how-to-use-properties-settings-default-in-script-layout-cshtml). Und ConfigurationManager sollte in den Ansichten verfügbar sein. – lavrik

Verwandte Themen