c# - 打印和/或修改 razor 编译器服务用于编译 cshtml 的 c# 版本

标签 c# razor razorgenerator

我希望能够找出 razor 使用哪个 C# 版本来编译我的 cshtml 模板。我想要这个的原因是 this breaking change .

我们在 foreach 语句中有一个 lambda,它在我们的本地开发机器上运行良好,但在我们的测试环境(没有安装 C# 5)上产生了一个错误。这个错误非常难以调试(我们甚至复制了所有测试环境 DLL 和数据库,但仍然无法重现该错误)。

因此,为了防止将来出现这种开发/测试差异,我想知道是否有一种方法可以指定 razor 应该用来编译 cshtml 文件的 C# 版本。如果我可以检查 razor 使用的 C# 版本(通过打印),那就太好了。

更新:根据要求,提供有关此行为如何发生的更多详细信息。
我们使用 devexpress mvc 网格在 razor View 中显示数据。为了以动态方式添加列,我们循环(foreach)一个列表,该列表将列插入数据网格(使用 lambda)。一个简化的例子:

@Html.DevExpress().GridView(
    settings =>
    {
        settings.Name = "gvDashboard";
        //Some more settings

        settings.Columns.Add(column =>
        {
            column.FieldName = Model.DashboardItems.PropertyName(p => p.Id);
            column.Caption = "Id";
            //Some more column settings
        });

        foreach (var extraColumnLoopVar in Model.ExtraColumns)
        {
            //We added this to solve the problem
            var extraColumn = extraColumnLoopVar; 

            settings.Columns.Add(column =>
            {
                column.Caption = extraColumn.Name;
                //Some more column settings

                column.SetDataItemTemplateContent(content =>
                {
                    Html.ViewContext.Writer.Write(extraColumn.MyValue);
                });
            });
        }
    });

最佳答案

razor 的版本在 Views 目录中的 Web.config 文件中指定。它必须与 System.Web.WebPages 程序集的依赖程序集列表中的版本之一相匹配。此条目位于主 Web.config 文件中(通常位于应用程序树的根目录中)

从配置文件中检索数据非常简单。查看ConfigurationManager为此上课。如果您想在运行时执行此操作。

也可以根据应用程序引用的程序集来确定 Razor 版本。您可以为此使用反射,这里有一个片段吐出所有引用的程序集:

var sb = new StringBuilder();
Assembly asm = Assembly.GetExecutingAssembly();
sb.AppendLine("File Version:");
sb.AppendLine(asm.FullName);

sb.AppendLine("References :");
AssemblyName[] asmNames = asm.GetReferencedAssemblies();
foreach (AssemblyName nm in asmNames)
{
    sb.AppendLine(nm.FullName);
}

// use sb.ToString() to print out wherever you need to

显然,根据您选择的在运行时评估此信息的方法,可能会对性能产生影响。

更新 1

从下面的评论中,我认为当您提到编译时,您指的是编译时的 Razor View 解析过程。还有“Razor View Compilation”的其他概念见Razor Generator ,无论您指的是哪一个,都依赖于对 System.Web.WebPages 程序集的引用,其中包含 Razor View 引擎本身的库依赖项。因此,如果您知道您指向的是哪个程序集,您就知道您使用的是哪个版本的 Razor。

更新 2

考虑到您担心与您在 View 中使用的 C# 版本发生冲突,您应该使用以下经验法则:您应该始终引用以框架为目标的 DLL (System.Web.WebPages)您正在使用。重要的是要记住,MVC 框架的更新时间线与语言本身不同。一个很好的例子是 async 关键字,它首先被添加到语言中,后来被 MVC 框架采用。通常新版本的 .NET Framework 向后兼容直到 2.0 版,当您使用已弃用的内容时,您会收到编译警告。如果您想在编译时使用旧版本的框架,您可以随时在 IDE 上更改目标框架。

除了获得正确的引用和目标框架外,请记住,当您在 IIS 中设置 Web 应用程序时,您指定了一个与框架版本相关联的应用程序池。您可能正在使用 .NET Framework 的新功能,并且您可能希望它们能够正常工作,因为您安装了新版本,但您的应用程序正在不同版本的应用程序池中运行。

在 DLL 和框架版本之间出现这种令人讨厌的混淆之前,我会遵循升级指南,同时考虑到我在以前版本中实现的一些代码可能无法在新版本中正常工作。

更新 3

这里有一些代码可以在运行时检索您的 CLR 版本,如 MSDN 中所述。 .

// Get the common language runtime version.
Version ver = Environment.Version;
Console.WriteLine("CLR Version {0}", ver.ToString());

关于c# - 打印和/或修改 razor 编译器服务用于编译 cshtml 的 c# 版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21991886/

相关文章:

c# - 焦点移出后从文本输入获取值并显示该值的数据

asp.net-mvc - Visual Studio 2013 持有 App_global.asax.PDB 文件?

c# - 将 Webforms 升级到 MVC : Razor Namespace in view web. 配置不起作用

c# - 如何读取 ASP .NET Core Razor Pages 中的连接字符串

c# - 在哪里可以找到 System.Web.Helpers、System.Web.WebPages 和 System.Web.Razor?

c# - 从CSharp/.net使用gmail SMTP发送邮件

c# - 访问特定(非当前)文化的资源字符串

c# - 如何修复我的后台解决方案以进行线程安全调用?

c# - Kendo MVC 网格创建操作 "maxJsonLength exceed"