这是改写了 ASP.NET Core 之后的一大基础,ASP.NET Core 编译成 YourApp.Views.dll,不再像以前一样可以直接修改 Views 资料夹下的 .cshtml,重新整理就看修改后的结果。必须停止侦错,重新编译才会更新。
让我的前端开发过程很痛苦,我采用「轻前端」的开发策略,cshtml 是主体,JavaScript 部分只用 Vue.js 处理 MVVM 及使用 AJAX 方式调整呼叫 WebAPI,因此常要反覆调整HTML元素的v-model、v-bind、v-on标签和CSS样式等,每一个动一个地方想看的结果就得停止侦错、重聚,再重侦错,看浏览器关了又打开、打开过去 MVC5 再改 cshtml 后存档 + 浏览重整看结果的开发程序才是正常人能站立的开发方式吧!
研究找到解决方案。在Razor文件编译 ASP.NET Core查到,ASP.NET Core 3.1 起支持启用 Razor 运行时编译,允许 Razor 页面或 MVC 更新启用 cshtml 动态编译,恢复 MVC5 时代归档重整的模式。而从 VS2019 16.5。 4起(依文件释出日期4/14推测),新增ASP.NET Core专案时会多一个「启用Razor运行时编译」选项:(实测要ASP.NET Core 3.1以后会有这个选项)
勾选后,项目会多引用一个 Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation Package:
而 Properties/launchSettings.json 则有一个 ASPNETCORE_HOSTINGSTARTUPASSEMBLIES 变数可以使用 cshtml 执行期编译:
//... 略
"profiles": {
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development",
"ASPNETCORE_HOSTINGSTARTUPASSEMBLIES": "Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation"
}
}
//... 略
如果是已经建立好的ASP.NET核心3.1专案,可以手动安装 Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation NuGet包,比照上述方式加入ASPNETCORE_HOSTINGSTARTUPASSEMBLIES参数。
Razor文件编译 ASP.NET Core 提到 Startup.ConfigureServices() 加上services.AddRazorPages().AddRazorRuntimeCompilation()的做法,不如用 ASPNETCORE_HOSTINGSTARTUPASSEMBLIES 变数动态切换来方便。
注:Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation 需要 .NET Core 3.1 以上版本,不支持 ASP.NET Core 2.x。
一些,cshtml 动态合成在开发阶段会出现一些特殊情况,在线上环境会动态合成和启用.NET Core File Watcher损失一些功能,而部署 .cshtml 文件会增加原始码外泄和被恶意窜改的风险,较不建议使用。 故预设发布时,.cshtml 预设还是会编译成 AppName.Views.dll,输出结果也不会包含视图或页面资料夹,若你有很好的理由要在正式环境中启用,可在 .csproj 中加入RazorCompileOnPublish属性设置为 false(默认为 true):
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
<CopyRefAssembliesToPublishDirectory>false</CopyRefAssembliesToPublishDirectory>
<RazorCompileOnPublish>false</RazorCompileOnPublish>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation" Version="3.1.3" />
</ItemGroup>
</Project>
如此,输出时将不会产生 AppName.Views.dll,MVC5 时代知识的 Views/Pages 资料夹也会回来啰。