如何实现两个Web项目间Razor Page的共享复用?
用Razor类库共享Razor Pages搜索页面方案
完全可以用Razor Class Library(RCL)存放共享的.cshtml页面及其后台.cs文件,具体步骤如下:
1. 创建支持页面的Razor类库
- 在解决方案中新建项目,选择Razor Class Library模板,创建时勾选「支持页面和视图」选项(如果没选,手动在项目里建
Pages目录也可以)。 - 类库生成后,直接在
Pages目录下创建你的搜索页面,比如Search.cshtml(页面UI)和对应的Search.cshtml.cs(后台逻辑)。
2. 编写共享页面代码
- 在
Search.cshtml里写搜索表单、结果展示的Razor/HTML代码,和普通Razor Pages页面写法完全一致。 - 后台
Search.cshtml.cs里处理页面逻辑,比如调用Web API获取数据的逻辑,示例代码:
注:依赖注入的服务(比如public class SearchModel : PageModel { private readonly HttpClient _httpClient; public SearchModel(HttpClient httpClient) { _httpClient = httpClient; } [BindProperty(SupportsGet = true)] public string Query { get; set; } public List<SearchResult> Results { get; set; } = new(); public async Task OnGetAsync() { if (!string.IsNullOrWhiteSpace(Query)) { Results = await _httpClient.GetFromJsonAsync<List<SearchResult>>($"/api/search?q={Uri.EscapeDataString(Query)}"); } } }HttpClient)不用在RCL里配置,由宿主Web项目负责注入即可。
3. 在Web项目中引用并配置
- 给内部、外部两个Web项目分别添加对这个RCL的项目引用(右键Web项目→添加→项目引用→选中你的RCL)。
- 配置Web项目的路由,让它能访问RCL里的共享页面:
在Web项目的Program.cs中,修改Razor Pages的配置:
如果不需要自定义路由,直接访问builder.Services.AddRazorPages() .AddRazorPagesOptions(options => { // 自定义路由,让两个项目都能用"/search"访问共享页面 options.Conventions.AddPageRoute("/Search", "/search"); });/Pages/Search也能打开页面,但自定义路由更友好。
4. 静态资源处理(若有)
- 如果搜索页面用到CSS、JS等静态资源,把它们放在RCL的
wwwroot目录下,Web项目会自动识别这些资源,使用方式和项目自身的静态资源一致,比如<link rel="stylesheet" href="/css/search.css" />。
5. 差异化展示(可选)
- 如果两个项目需要对搜索页面做差异化调整,可以通过依赖注入实现:定义一个接口(比如
ISearchConfig),在两个Web项目中分别实现不同的配置,注入到RCL的后台类中,页面根据配置渲染不同内容。
这样两个Web项目就能共用同一套搜索页面代码,修改一次即可同步更新,完全避免重复开发。
内容的提问来源于stack exchange,提问作者bigtoasty
相关产品推荐
相关产品推荐

