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

前端之家收集整理的这篇文章主要介绍了打印和/或修改剃刀编译器服务用于编译cshtml的c#版本前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想知道哪个C#版本的剃刀用来编译我的cshtml模板.我想要这个的原因是 this breaking change.

我们在一个foreach语句中有一个lambda,在本地的dev机器上工作得很好,但是在我们的测试环境中没有安装C#5的bug.这个错误很难调试(我们甚至复制了所有的测试环境DLL和数据库,并且仍然无法重现错误).

所以为了防止这个开发/测试在将来的差异,我想知道是否有一种方法来指定剃须刀应该用来编译cshtml文件的C#版本.如果我可以检查剃刀使用的C#版本(通过打印)也是很好的.

更新:根据要求,有关如何发生这种行为的更多细节.
我们使用devexpress mvc网格在我们的剃刀视图中显示数据.要以动态方式添加列,我们循环(foreach)在datagrid中插入列的列表(使用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);
                });
            });
        }
    });

解决方法

剃须刀的版本在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视图解析过程.还有“剃刀视图编译”的其他概念见Razor Generator,无论你做什么都意味着依赖于引用了包含Razor View Engine本身的库依赖关系的System.Web.WebPages程序集.所以如果你知道你指向哪个程序集,你会知道你使用哪个版本的Raz.

更新2

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

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

之前这个令人讨厌的混合在DLL&框架版本我会遵循升级指南,考虑到我使用以前版本实现的一些代码可能无法正常使用新的代码.

更新3

以下是一些代码,用于在Runtime上检索CLR版本,如MSDN所述.

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

猜你在找的HTML相关文章