如何在.cshtml razor文件中访问项目属性?

时间:2013-04-16 10:29:24

标签: asp.net asp.net-mvc razor

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

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

而foo是boolean

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

2 个答案:

答案 0 :(得分:10)

您不应该直接从您的视图中调用ConfigurationManager。视图在MVC中应该是“哑”,即不了解数据结构或后端,并且通过直接调用ConfigurationManager,您的视图对于如何存储设置了解得太多。如果您将设置更改为使用其他商店(即数据库),则必须更改视图。

因此,您应该在其他地方获取该值并将其传递给您的视图,以便您的视图可以处理渲染,就是这样。您可能有两个选择:

  1. 在ViewBag中添加内容并在视图中抓取
  2. 从将强类型ViewModel传递到局部视图的公共控制器渲染操作。
  3. 我不鼓励选项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" })
    

    其中呈现强类型的局部视图(〜/ Views / Common / Settings.cshtml),如下所示:

    @model YourProject.Models.SettingsModel
    
    @if(Model.Foo)
    {
        // So something
    }
    

    这样你仍然使用强类型模型和视图,你的布局视图保持干净简洁,你的局部视图仍然“哑”

答案 1 :(得分:0)

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

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

因此您可以尝试使用ConfigurationManager.AppSettings字典,如

ConfigurationManager.AppSettings["Setting"]