2013-04-16 39 views
6

是否可以在.cshtml Razor文件中访问我的项目属性? 我需要的是这样的:如何访问.cshtml razor文件中的项目属性?

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

而foo是一个boolean

我得到的是,由于安全原因,这是不可能的错误。

+1

如何在ViewBag(在Controller中)设置该属性并从那里调用它? –

+0

好主意,会尝试 – gurehbgui

+0

但问题是,这是我的_Layout页面,我在哪里有Viewbag呢?我不会将它设置在我拥有的每个控制器中。 – gurehbgui

回答

10

你真的不应该被直接调用ConfigurationManager你的看法。在MVC中,视图应该是'愚蠢的',即不具备数据结构或后端的任何知识,并且通过直接调用ConfigurationManager您的视图太了解您的设置存储方式。如果您将设置更改为使用其他商店(即数据库),那么您必须更改视图。

因此,您应该在别处获取该值并将其传递给您的视图,以便您的视图只需处理它就可以了。你可能有2种选择:

  1. 添加的东西到ViewBag并抓住它在视图
  2. 渲染从通过一个强类型的视图模型的局部视图公共控制器的操作。

我会阻止选项1,因为通常避免ViewBag是很好的,因为它没有强类型(Is using ViewBag in MVC bad?)。此外,要做到这一点,你必须从每个控制器的BaseController继承,这可能会很痛苦,或者创建一个覆盖ActionExecuted并填充ViewBag那里的东西的全局动作过滤器。

选项2可能更好。我想创建一个共同的控制器是这样的:

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

然后在您的布局文件,你可以拨打:

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

这使得一个强类型的局部视图(〜/查看/通用/设置。 CSHTML),它看起来像:

@model YourProject.Models.SettingsModel 

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

这样,你仍然在使用强类型模型和视图,布局视图保持清洁,简单,你的部分观点仍然是“哑巴”

+0

如果在_Layout视图中需要这么做,该怎么办? –

+0

这仍然有效 - 只需从布局视图中调用动作即可 –

0

的应用程序设置存储在web.config文件中

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

所以你可以尝试使用ConfigurationManager.AppSettings字典一样

ConfigurationManager.AppSettings["Setting"] 
+0

然后我得到一个错误,“配置管理器”在此上下文中不可用 – gurehbgui

+1

您应该阅读控制器中的配置管理器,因为它不是布局页面的工作来执行此操作。布局页面的唯一目的是呈现赋予它的值。提供值来查看是控制器的责任。 –

+0

检查[this](http://stackoverflow.com/questions/11395118/how-to-use-properties-settings-default-in-script-layout-cshtml)。和ConfigurationManager应该是可视的观点。 – lavrik

相关问题