检测Razor/C#代码?

检测Razor/C#代码?,c#,razor,C#,Razor,有没有办法检测HTML页面是否包含razor/C代码?本质上,我希望用户能够提供自定义布局,并使用我将用RenderSection替换的标记。在进行替换之前,我想验证一下,在浏览器中是否没有任何HTML包含类似于的内容?不,因为除非程序员犯了错误,否则呈现的HTML中没有Razor/C代码,只有由此产生的HTML 你问的就像是问用什么样的烤箱从比萨饼上烤出比萨饼。坏消息——你永远不会知道 如果您提供了这些标记的合理标记,您可以用javascript解析它们,但是,您必须自己将元数据作为生成的ht

有没有办法检测HTML页面是否包含razor/C代码?本质上,我希望用户能够提供自定义布局,并使用我将用RenderSection替换的标记。在进行替换之前,我想验证一下,在浏览器中是否没有任何HTML包含类似于
的内容?不,因为除非程序员犯了错误,否则呈现的HTML中没有Razor/C代码,只有由此产生的HTML

你问的就像是问用什么样的烤箱从比萨饼上烤出比萨饼。坏消息——你永远不会知道


如果您提供了这些标记的合理标记,您可以用javascript解析它们,但是,您必须自己将元数据作为生成的html的一部分输出。

我对Razor标记不太了解——但我认为,当您获取他们传入的布局字符串时,您将需要解析文本,获取以
@
开头的所有内容,并将这些单词放入数组中。然后,当您将其重新发布到您的网站时,请使用razor代码访问数组中的数据

或者,更简单的方法是检查所有传入的代码,并用不同的符号替换所有的
@
符号,例如
&
,这样它就不会被Razor处理器解释:


layoutString=layoutString.Replace('@','&')

阅读您对TomTom的评论后;答案是:


没有。Razor没有任何公共语法分析器

不,不在浏览器中。以编程方式在服务器端查看一个文件并确定它是否有Razor/C#。这是在它被渲染之前。我希望Razor引擎上有一些API,比如标记器或者我可以用来检测的东西。我不知道有这样的代码。为了限制模板仅使用HTML,您可以简单地强制模板文件包含在
.HTML
文件中,而不是接受
.cshtml
文件吗?我不认为ASP.NETMVC会允许Razor代码只出现在HTML文件中。这是事实,但它们旨在成为布局页面,以便用户可以指定页面的布局。在某个时刻,我必须将它们的“body go here”、“scripts go here”标记(我将告诉它们这些神奇标记的标记)替换为视图中的
@部分。看起来最简单的方法就是用
RenderSection
替换魔术标签,然后将页面设置为布局。这将很好地利用现有的布局引擎,避免我重新发明轮子。为了安全起见,我想在添加RenderSection之前对C#的页面进行中性化。好吧,在新的构建中会这样做-整个AST解析器都是可用的。您可以在运行时使用它来检测项目中的文件是否不包含问题中要求的任何razor代码?您可以重新托管解析器,是的。我们在编写自定义工具时使用它,该工具作为构建步骤执行,只需依次扫描文件,并通过razor parser.Cool运行它们。那么我猜您已经准备好了一个正确的答案。@Marc我看到了System.Web.Razor.Parser命名空间的MSDN文档,这就是您所指的吗?我猜是剃须刀(可能是一个很好的起点?或者你通常必须创建一个ParserContext吗?我知道我有点超出了问题的范围,但是如果你能建议一个起点,我将不胜感激。+1是的,我突然想到,也许用HTML字符代码@;替换所有@就可以了。这实际上会使页面中性化同时希望保留显示,假设没有内联javascript会因此中断。我总是可以请求将任何javascript外部化以避免该问题。我考虑过使用char代码而不是&symbol,但我不能100%确定Razor将如何解释它。如果你知道开始和结束代码对于您想要允许的javascript,您应该能够在javascript的这一部分中禁用替换方法。您采取的任何一种方法都要确保您测试它,以确保没有坏代码通过,好代码丢失。