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

C# 如何使用Razor语法引用应用程序设置,c#,asp.net-mvc-4,razor,C#,Asp.net Mvc 4,Razor,我想将Properties.Settings.Default.preloglyph的值嵌入MVC4应用程序中_splash.cshtml的标记中 唉,插入到这个内联JavaScript中是行不通的 spinnerGif.setAttribute("src", "@MyAppNamespace.Properties.Settings.Default.PreloadGlyphUrl"); 因为IDE报告说 “MyAppNamespace.Properties.Setting.Defaul

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

唉,插入到这个内联JavaScript中是行不通的

    spinnerGif.setAttribute("src", "@MyAppNamespace.Properties.Settings.Default.PreloadGlyphUrl"); 
因为IDE报告说

“MyAppNamespace.Properties.Setting.Default”由于其 保护级别

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

如何将
psd
放入视图的上下文中,以便执行类似操作

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

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

这意味着模型上的属性必须是公共的。我假定此处的属性之一
properties.Settings.Default.preloglyph
必须是内部的或私有的,因此您无法从视图程序集访问它

不幸的是,您不能在这里使用InternalsVisbleToAttribute,因为程序集是动态的,您无法知道它将被调用什么,因此现实中唯一的选择是将属性公开(或将值复制到具有公共属性的对象)

我见过一些使用反射访问非公共属性的代码(或者在后台使用反射的动态包装器)。这也可能是一种选择

为什么不创建一个viewmodel来将所需的数据传递给视图呢。。您可以在上面设置
MyAppNamespace.Properties.Settings.Default.url
,并使用

return View(new ViewModel { PreloadGlyphUrl = MyAppNamespace.Properties.Settings.Default.PreloadGlyphUrl});
然后,您可以访问相应的:

@Model.PreloadGlyphUrl

刷新任何页面时,视图将从模型中动态编译为单独的程序集

这意味着模型上的属性必须是公共的。我假定此处的属性之一
properties.Settings.Default.preloglyph
必须是内部的或私有的,因此您无法从视图程序集访问它

不幸的是,您不能在这里使用InternalsVisbleToAttribute,因为程序集是动态的,您无法知道它将被调用什么,因此现实中唯一的选择是将属性公开(或将值复制到具有公共属性的对象)

我见过一些使用反射访问非公共属性的代码(或者在后台使用反射的动态包装器)。这也可能是一种选择

为什么不创建一个viewmodel来将所需的数据传递给视图呢。。您可以在上面设置
MyAppNamespace.Properties.Settings.Default.url
,并使用

return View(new ViewModel { PreloadGlyphUrl = MyAppNamespace.Properties.Settings.Default.PreloadGlyphUrl});
然后,您可以访问相应的:

@Model.PreloadGlyphUrl

从模型中,您可以创建一个新的HtmlHelper,如下所示:

HTMLEX.cs

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

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

您可以创建一个新的HtmlHelper,如下所示:

HTMLEX.cs

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

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

在模型、tempdata或viewdata中传递它有什么问题?什么模型?这或多或少是个问题,真的。这是一个spa应用程序,MVC定义了两个视图,一个是index.cshtml,另一个是_splash.cshtml,它们所做的只是显示一个微调器并加载我的Durandal应用程序
View()
是一种内置的东西,不是我写的,它是由项目模板提供的。在模型、tempdata或viewdata中传递它有什么问题?什么模型?这或多或少是个问题,真的。这是一个spa应用程序,MVC定义了两个视图,一个是index.cshtml,另一个是_splash.cshtml,它们所做的只是显示一个微调器并加载我的Durandal应用程序
View()
是一种内置的东西,不是我写的,它是由项目模板提供的。啊哈!这就是我需要知道的。找不到任何定义视图模型的东西真的让我感到困惑。我马上就来试试。很好。关键的洞察是,视图实际上应该命名为ViewRender,并且可以在不传递静态内容模型的情况下调用,这就是这里发生的事情。意识到这实际上是一个特例,并且通常会创建和传递一个视图模型,事情就变得简单多了。很高兴你把它整理好了啊哈!这就是我需要知道的。找不到任何定义视图模型的东西真的让我感到困惑。我马上就来试试。很好。关键的洞察是,视图实际上应该命名为ViewRender,并且可以在不传递静态内容模型的情况下调用,这就是这里发生的事情。意识到这实际上是一个特例,并且通常会创建和传递一个视图模型,事情就变得简单多了。很高兴您能解决这个问题