C# 如何将Razor文件添加到Xamarin项目
我试图让Razor在我的Xamarin项目中工作,但我似乎无法让Visual Studio 2017认识到文件需要由Razor预处理器处理 当我要添加一个新文件时,没有C# 如何将Razor文件添加到Xamarin项目,c#,xamarin,razor,C#,Xamarin,Razor,我试图让Razor在我的Xamarin项目中工作,但我似乎无法让Visual Studio 2017认识到文件需要由Razor预处理器处理 当我要添加一个新文件时,没有Razor或.cshtml的模板,所以我只是添加一个文本文件并将扩展名改为.cshtml。然后,在文件属性中,我将自定义工具设置为RazorTemplatePreprocessor 然而,尽管这样做了,VisualStudio并没有生成我期望的.cs文件 我错过了什么 更新和解决方法:与@SushiHangover进行了有益的对话
Razor
或.cshtml
的模板,所以我只是添加一个文本文件并将扩展名改为.cshtml
。然后,在文件属性中,我将自定义工具设置为RazorTemplatePreprocessor
然而,尽管这样做了,VisualStudio并没有生成我期望的.cs文件
我错过了什么
更新和解决方法:与@SushiHangover进行了有益的对话(请参阅下面的答案和评论链),结果表明.NET标准库项目目前不允许通过“添加项向导”添加Razor文件,如果手动添加,则无法正确编译。从VisualStudio15.5.2开始就是这样。我打开了微软的一个bug,但与此同时,我有一个超级笨拙的解决方法,如下所示
最终,在Xamarin项目中可能使用的Razor文件只用于生成.cs文件,这些文件编译成包含GenerateString
方法的类,代码可以调用该方法生成HTML,然后将其输入WebView。所以,我想,为什么不创建一个常规的.NET框架库(不是.NET标准)并将我所有的Razor文件放在那里呢。在该项目中,您可以正常添加它们,并且它们可以正常工作
但是由于我的项目的其余部分是.NET标准的,我不想混搭,所以我实际上没有任何其他项目引用这个库。相反,我只是将生成的.cs文件作为链接(单击“添加”按钮旁边的小箭头,然后选择“添加为链接”)包含在我的“真实”项目(我最初想要添加它们的项目)中。所以包含Razor文件的库只有一个目的,那就是生成.cs文件,句号。这些文件实际上被编译到另一个库中
我希望这对别人有帮助!当微软修复这个bug时,我将再次更新这个线程(并将我的Razor文件移回它们应该在的位置)
编辑2
Microsoft已将我的错误标记为“正在考虑中”。如果此问题影响到您,请更新投票,以鼓励他们尽快修复
Razor文件模板在Visual Studio for Mac(VS4M
)上的文本模板组下可用,但Visual Studio for Windows(VS4W
)的最新版本已丢失
在VS4W上,您只需编辑试图添加Razor文件的.csproj
:
生成的.cs
文件的编译
项,包括.cshtml
文件的依赖项
标记
.cshtml
的None
项,包括生成器
和lastgeneoutput
标记
创建这两个文件(.cshtml
&.cs
)(它们可以为空以启动)
示例(Xamarin.iOS、Xamarin.Android和PCL项目)
RazorTemplate.cshtml
RazorTemplate预处理器
RazorTemplate.cs
示例(NetStandard2.0项目)
RazorTemplate.cshtml
RazorTemplate预处理器
RazorTemplate.cs
这不是答案,因为我误解了这个问题,所以答案实际上是@SushiHangover在上面说的
要获得Xamarin Razor页面,项目必须是WebViewApp,然后您可以向项目添加新的预处理Razor视图
来自Xamarin关于这个主题的博客
请参阅我们使用Xamarin文档构建混合应用程序,开始构建Razor混合应用程序。只需使用Xamarin Studio为iOS或Android创建新的WebView应用程序,或将WebView添加到任何现有的iOS或Android布局中,然后使用添加新的…预处理的Razor模板将Razor支持的web视图合并到Xamarin应用程序中。对于数据驱动的Razor混合应用程序的稍微复杂的示例,请查看我们的RazorTodo应用程序
这详细说明了如何将Razor视图添加到每个项目。是什么让您认为Xamarin会使用Razor文件?Xamarin的官方文档。()它们是动态生成HTML的一种方便方法,您可以将HTML输入Web视图。我在另一个项目中使用了这些模板,但我不是最初设置它的人,我似乎不知道他是如何做到的。“请注意,您可以轻松地将.cshtml Razor模板添加到任何现有的Xamarin项目中,不必使用这些解决方案模板。”模板缺失,请参阅我的答案。感谢回复!是否有某种类型的项目需要参与?我刚刚发现了一些有趣的东西。当我尝试将它添加到Xamarin.iOS或Xamarin.Android项目中时,一切都很好。但是,如果我尝试将其添加到“父”Xamarin项目中,它将不起作用。(两个文件正确地折叠在一起,但.cs文件从未更新。)我甚至尝试在Android项目中创建一个.cshtml文件,验证它是否有效,然后将其拖到父项目中,我得到了相同的效果。我可以在项目文件上撒些魔法粉让它工作吗?@BrianRak这是什么样的“父项目”呢?在新项目向导中,如果你选择跨平台应用程序>,你就有机会选择平台、UI技术和代码共享策略。就我而言,如果有必要的话,我会选择Android和iOS、本机和.NET标准。然后为您创建三个项目,一个用于每个本机项目,另一个用于上述两个项目,用于共享代码。我称之为“家长”的就是这个项目。我现在可以确认Razor文件在本机ap中工作
<ItemGroup>
<Compile Include="RazorTemplate.cs">
<DependentUpon>RazorTemplate.cshtml</DependentUpon>
</Compile>
</ItemGroup>
<ItemGroup>
<None Include="RazorTemplate.cshtml">
<Generator>RazorTemplatePreprocessor</Generator>
<LastGenOutput>RazorTemplate.cs</LastGenOutput>
</None>
</ItemGroup>
<ItemGroup>
<Compile Condition=" '$(EnableDefaultCompileItems)' == 'true' " Update="RazorTemplate.cs">
<DependentUpon>RazorTemplate.cshtml</DependentUpon>
</Compile>
</ItemGroup>
<ItemGroup>
<None Update="RazorTemplate.cshtml">
<Generator>RazorTemplatePreprocessor</Generator>
<LastGenOutput>RazorTemplate.cs</LastGenOutput>
</None>
</ItemGroup>