如何使用Razor语法引用应用程序设置

时间:2014-05-27 23:45:29

标签: c# asp.net-mvc-4 razor

我想将Properties.Settings.Default.PreloadGlyph的值嵌入到MVC4应用程序中_splash.cshtml的标记中。

唉,插入此内联JavaScript不起作用

    spinnerGif.setAttribute("src", "@MyAppNamespace.Properties.Settings.Default.PreloadGlyphUrl"); 

因为IDE报告

  

'MyAppNamespace.Properties.Setting.Default'由于其无法访问   保护水平。

它肯定在请求视图的控制器的范围内。这是Index()方法的简化版本。

public ActionResult Index()
{
  var psd = Properties.Settings.Default;
  return View();
}

如何将psd放入视图的上下文中,以便我可以这样做?

spinnerGif.setAttribute("src", "@psd.PreloadGlyphUrl"); 

2 个答案:

答案 0 :(得分:3)

您可以像这样创建一个新的HtmlHelper:

HtmlExtensions.cs

public static class HtmlExtensions
{
    public static string GetPreloadGlyphUrl(this HtmlHelper htmlHelper)
    {
        return Properties.Settings.Default.PreloadGlyphUrl;
    }
}

Page.cshtml

    <h2>@Html.GetPreloadGlyphUrl()</h2>

答案 1 :(得分:0)

刷新任何页面时,视图会动态编译为单独的程序集。

这意味着模型上的属性需要公开。我假设其中一个属性Properties.Settings.Default.PreloadGlyph必须是内部属性或私有属性,因此您无法从视图程序集中访问它。

很遗憾,您无法在此处使用InternalsVisbleToAttribute,因为程序集是动态的,您无法告诉它将被调用的内容,因此唯一的选择是将您的财产公开(或复制)具有公共属性的对象的值)

我见过一些使用反射访问非公共属性的代码(或者引擎盖下使用反射的动态包装器)。这也可能是一个选项

为什么不创建一个用于将所需数据传递到视图的viewmodel ..您可以在其上设置MyAppNamespace.Properties.Settings.Default.PreloadGlyphUrl并使用

将其传递给您的视图
return View(new ViewModel { PreloadGlyphUrl = MyAppNamespace.Properties.Settings.Default.PreloadGlyphUrl});

然后你可以访问proprety:

@Model.PreloadGlyphUrl

来自模型