使用Razor SDK跨程序集托管视图,修改后页面不生效如何解决?
解决独立Razor类库视图热重载失效的问题
在.NET Core 2.1 RC1搭配Microsoft.NET.Sdk.Razor的场景下,独立类库中的视图修改后无法实时刷新是个常见的预览版问题,给你几个经过验证的解决办法:
1. 调整Razor编译配置
修改你的独立Razor类库项目文件(.csproj),添加以下配置,让开发时不预编译视图,同时开启文件监听:
<PropertyGroup> <!-- 关闭构建时编译视图,开发时动态加载 --> <RazorCompileOnBuild>false</RazorCompileOnBuild> <!-- 发布时正常编译视图,保证生产环境性能 --> <RazorCompileOnPublish>true</RazorCompileOnPublish> <!-- 启用Razor文件监听,感知视图变化 --> <RazorWatch>true</RazorWatch> </PropertyGroup>
这个配置会让Razor引擎在开发模式下直接读取原始.cshtml文件,而不是使用预编译的程序集,修改后刷新页面就能看到变化。
2. 配置主应用的视图搜索路径与监听
在主ASP.NET Core应用的Startup.cs中,修改ConfigureServices方法,把独立类库的视图目录添加到Razor引擎的搜索路径,并启用文件变更自动重新编译:
using System.IO; using Microsoft.AspNetCore.Mvc.Razor; // ... public void ConfigureServices(IServiceCollection services) { services.AddMvc() .AddRazorOptions(options => { // 替换为你的独立类库程序集名称(比如"YourRazorClassLibrary") var classLibAssembly = typeof(YourRazorClassLibrary.Controllers.SampleController).Assembly; // 指向类库项目的Views目录,根据你的项目结构调整路径 var classLibViewsPath = Path.Combine( Directory.GetCurrentDirectory(), "..", "YourRazorClassLibrary", "Views" ); options.FileProviders.Add(new PhysicalFileProvider(classLibViewsPath)); // 允许视图文件变更时自动重新编译 options.AllowRecompilingViewsOnFileChange = true; }); }
这样主应用的Razor引擎会直接监测类库项目中.cshtml文件的变化,修改后无需重启应用就能刷新生效。
3. 结合dotnet watch增强监测
如果上面的方法仍有问题,用dotnet watch来辅助监测类库的视图变化:
在**主应用的项目文件(.csproj)**中添加以下配置,让dotnet watch监听类库的视图文件:
<ItemGroup> <!-- 替换为你的类库项目路径,监听所有.cshtml文件 --> <Watch Include="..\YourRazorClassLibrary\Views\**\*.cshtml" /> </ItemGroup>
然后用命令dotnet watch run启动主应用,当类库中的视图修改时,dotnet watch会触发视图重新编译,刷新页面即可看到更新。
额外提示
- .NET Core 2.1 RC1是预览版本,部分Razor类库的热重载功能存在bug,建议优先考虑升级到2.1正式版或更高版本,正式版对独立类库的视图热重载支持更稳定。
- 确保你的独立类库项目使用的是
Microsoft.NET.Sdk.RazorSDK,项目文件开头应为<Project Sdk="Microsoft.NET.Sdk.Razor">,而不是普通的Microsoft.NET.Sdk。
内容的提问来源于stack exchange,提问作者Thijs
相关产品推荐
相关产品推荐

