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

gur*_*gui 8 asp.net asp.net-mvc razor

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

@if (myProject.Properties.Settings.Default.foo) {...}
Run Code Online (Sandbox Code Playgroud)

而foo是一个 boolean

我得到的错误是因为安全原因不可能.

Ian*_*dge 11

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

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

  1. 在ViewBag中添加一些内容并在视图中抓取它
  2. 从将强类型ViewModel传递到局部视图的公共控制器渲染操作.

我不鼓励选项1,因为一般情况下避免使用它是好的,ViewBag因为它不是强类型的(在MVC中使用ViewBag是坏的吗?).此外,为了做到这一点,你要么必须从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);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在您的布局文件中,您可以调用:

@Html.Action("Settings", new { controller = "Common" })
Run Code Online (Sandbox Code Playgroud)

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

@model YourProject.Models.SettingsModel

@if(Model.Foo)
{
    // So something
}
Run Code Online (Sandbox Code Playgroud)

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