我想将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");
答案 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
来自模型