让 ASP.NET Core 也能改完 cshtml 立即看结果

    这是改写了 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以后会有这个选项)
    1640159466(1).jpg
    勾选后,项目会多引用一个 Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation Package:
    1640159482(1).jpg
    而 Properties/launchSettings.json 则有一个 ASPNETCORE_HOSTINGSTARTUPASSEMBLIES 变数可以使用 cshtml 执行期编译:

    1. //...
    2. "profiles": {
    3. "IIS Express": {
    4. "commandName": "IISExpress",
    5. "launchBrowser": true,
    6. "environmentVariables": {
    7. "ASPNETCORE_ENVIRONMENT": "Development",
    8. "ASPNETCORE_HOSTINGSTARTUPASSEMBLIES": "Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation"
    9. }
    10. }
    11. //...

    如果是已经建立好的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。

    1640159560(1).jpg
    一些,cshtml 动态合成在开发阶段会出现一些特殊情况,在线上环境会动态合成和启用.NET Core File Watcher损失一些功能,而部署 .cshtml 文件会增加原始码外泄和被恶意窜改的风险,较不建议使用。 故预设发布时,.cshtml 预设还是会编译成 AppName.Views.dll,输出结果也不会包含视图或页面资料夹,若你有很好的理由要在正式环境中启用,可在 .csproj 中加入RazorCompileOnPublish属性设置为 false(默认为 true):

    1. <Project Sdk="Microsoft.NET.Sdk.Web">
    2. <PropertyGroup>
    3. <TargetFramework>netcoreapp3.1</TargetFramework>
    4. <CopyRefAssembliesToPublishDirectory>false</CopyRefAssembliesToPublishDirectory>
    5. <RazorCompileOnPublish>false</RazorCompileOnPublish>
    6. </PropertyGroup>
    7. <ItemGroup>
    8. <PackageReference Include="Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation" Version="3.1.3" />
    9. </ItemGroup>
    10. </Project>

    如此,输出时将不会产生 AppName.Views.dll,MVC5 时代知识的 Views/Pages 资料夹也会回来啰。