我们在一个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); }); }); } });
解决方法
从配置文件检索数据相当简单.参见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());