8

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

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

而 foo 是boolean

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

4

2 回答 2

11

您不应该ConfigurationManager直接从您的视图中调用。视图在 MVC 中应该是“愚蠢的”,即不了解数据结构或后端,并且通过ConfigurationManager直接调用您的视图非常了解您的设置是如何存储的。如果您更改设置以使用不同的存储(即数据库),那么您必须更改您的视图。

因此,您应该在其他地方获取该值并将其传递给您的视图,以便您的视图只负责渲染它,仅此而已。您可能有 2 个选项:

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

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

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

它呈现一个强类型的局部视图(~/Views/Common/Settings.cshtml),如下所示:

@model YourProject.Models.SettingsModel

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

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

于 2013-04-16T11:55:49.183 回答
0

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

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

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

ConfigurationManager.AppSettings["Setting"]
于 2013-04-16T10:36:29.327 回答