如何在C# Razor Pages间共享自定义OnGetResources处理方法?
在Razor Pages中共享自定义OnGet处理方法的几种方案
针对你需要在多个Razor Pages中复用OnGetResources方法的需求,以下是几种实用的实现方式:
1. 抽象基类方案(推荐)
创建包含共享方法的抽象基类,让需要该逻辑的页面模型继承这个基类,实现一次编写多页面复用:
步骤1:定义抽象基类
public abstract class ResourceBasePageModel : PageModel { protected readonly YourDbContext _dbContext; // 通过构造函数注入DbContext public ResourceBasePageModel(YourDbContext dbContext) { _dbContext = dbContext; } // 共享的OnGetResources方法 public async Task<JsonResult> OnGetResources(int id) { var resourceData = await _dbContext.MyResource .Where(x => x.OtherResource.Id == id) .ToListAsync(); return new JsonResult(new { data = resourceData }); } }
步骤2:页面模型继承基类
在需要使用该方法的页面模型中,继承上述基类并传递依赖:
public class ProductPageModel : ResourceBasePageModel { public ProductPageModel(YourDbContext dbContext) : base(dbContext) { } // 页面自身的OnGet或其他自定义逻辑 public async Task OnGet() { // ... 页面专属逻辑 } }
优势:统一管理共享逻辑,修改只需调整基类;完全避免代码重复。
注意:C#是单继承语言,若页面已继承其他基类则无法使用此方案。
2. 服务封装方案
将资源查询逻辑封装为独立服务,在页面模型中注入服务并调用,实现逻辑与页面解耦:
步骤1:创建资源服务
// 定义服务接口 public interface IResourceService { Task<List<MyResource>> GetResourcesByRelatedId(int relatedId); } // 实现服务逻辑 public class ResourceService : IResourceService { private readonly YourDbContext _dbContext; public ResourceService(YourDbContext dbContext) { _dbContext = dbContext; } public async Task<List<MyResource>> GetResourcesByRelatedId(int relatedId) { return await _dbContext.MyResource .Where(x => x.OtherResource.Id == relatedId) .ToListAsync(); } }
步骤2:注册服务
在Program.cs中注册服务:
builder.Services.AddScoped<IResourceService, ResourceService>();
步骤3:页面模型中使用服务
public class OrderPageModel : PageModel { private readonly IResourceService _resourceService; public OrderPageModel(IResourceService resourceService) { _resourceService = resourceService; } // 页面的OnGetResources方法,内部调用服务 public async Task<JsonResult> OnGetResources(int id) { var data = await _resourceService.GetResourcesByRelatedId(id); return new JsonResult(new { data }); } // 页面其他逻辑 public async Task OnGet() { // ... } }
优势:逻辑与页面完全解耦,服务可被其他组件复用;支持页面根据需求微调OnGetResources的返回格式。
3. Partial Class(分部类)方案
若页面不需要继承基类,可将共享方法放在同名分部类中,让编译器自动合并类定义:
步骤1:创建分部类存放共享方法
比如针对Index.cshtml.cs的页面模型,创建一个同名分部类:
public partial class IndexModel : PageModel { private readonly YourDbContext _dbContext; public IndexModel(YourDbContext dbContext) { _dbContext = dbContext; } public async Task<JsonResult> OnGetResources(int id) { var data = await _dbContext.MyResource .Where(x => x.OtherResource.Id == id) .ToListAsync(); return new JsonResult(new { data }); } }
步骤2:页面自身的分部类
public partial class IndexModel : PageModel { // 页面专属逻辑 public async Task OnGet() { // ... } }
优势:无需修改继承关系,灵活适配单个页面;
注意:每个需要的页面都要创建对应分部类,适合少量页面复用的场景。
内容的提问来源于stack exchange,提问作者yyy-t
相关产品推荐
相关产品推荐

