我希望能够找出 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/
我正在尝试使用ruby和Savon来使用网络服务。测试服务为http://www.webservicex.net/WS/WSDetails.aspx?WSID=9&CATID=2require'rubygems'require'savon'client=Savon::Client.new"http://www.webservicex.net/stockquote.asmx?WSDL"client.get_quotedo|soap|soap.body={:symbol=>"AAPL"}end返回SOAP异常。检查soap信封,在我看来soap请求没有正确的命名空间。任何人都可以建议我
我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..
大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje
最近,当我启动我的Rails服务器时,我收到了一长串警告。虽然它不影响我的应用程序,但我想知道如何解决这些警告。我的估计是imagemagick以某种方式被调用了两次?当我在警告前后检查我的git日志时。我想知道如何解决这个问题。-bcrypt-ruby(3.1.2)-better_errors(1.0.1)+bcrypt(3.1.7)+bcrypt-ruby(3.1.5)-bcrypt(>=3.1.3)+better_errors(1.1.0)bcrypt和imagemagick有关系吗?/Users/rbchris/.rbenv/versions/2.0.0-p247/lib/ru
在Rails4.0.2中,我使用s3_direct_upload和aws-sdkgems直接为s3存储桶上传文件。在开发环境中它工作正常,但在生产环境中它会抛出如下错误,ActionView::Template::Error(noimplicitconversionofnilintoString)在View中,create_cv_url,:id=>"s3_uploader",:key=>"cv_uploads/{unique_id}/${filename}",:key_starts_with=>"cv_uploads/",:callback_param=>"cv[direct_uplo
我是一个Rails初学者,但我想从我的RailsView(html.haml文件)中查看Ruby变量的内容。我试图在ruby中打印出变量(认为它会在终端中出现),但没有得到任何结果。有什么建议吗?我知道Rails调试器,但更喜欢使用inspect来打印我的变量。 最佳答案 您可以在View中使用puts方法将信息输出到服务器控制台。您应该能够在View中的任何位置使用Haml执行以下操作:-puts@my_variable.inspect 关于ruby-on-rails-如何在我的R
我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm
如何在ruby中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL
我想在Ruby中创建一个用于开发目的的极其简单的Web服务器(不,不想使用现成的解决方案)。代码如下:#!/usr/bin/rubyrequire'socket'server=TCPServer.new('127.0.0.1',8080)whileconnection=server.acceptheaders=[]length=0whileline=connection.getsheaders想法是从命令行运行这个脚本,提供另一个脚本,它将在其标准输入上获取请求,并在其标准输出上返回完整的响应。到目前为止一切顺利,但事实证明这真的很脆弱,因为它在第二个请求上中断并出现错误:/usr/b
您如何在Rails中的实时服务器上进行有效调试,无论是在测试版/生产服务器上?我试过直接在服务器上修改文件,然后重启应用,但是修改好像没有生效,或者需要很长时间(缓存?)我也试过在本地做“脚本/服务器生产”,但是那很慢另一种选择是编码和部署,但效率很低。有人对他们如何有效地做到这一点有任何见解吗? 最佳答案 我会回答你的问题,即使我不同意这种热修补服务器代码的方式:)首先,你真的确定你已经重启了服务器吗?您可以通过跟踪日志文件来检查它。您更改的代码显示的View可能会被缓存。缓存页面位于tmp/cache文件夹下。您可以尝试手动删除