ASP.NET Core Razor Pages结合JQuery遵循DRY原则复用代码咨询
解决方案
1. 重复后端逻辑迁移
你可以把共用逻辑封装为依赖注入服务,而非静态工具类,天然支持ApplicationContext参数传递:
首先创建服务接口与实现类(建议放在项目根目录的Services文件夹下统一管理):
// 服务接口 public interface IProjectService { Task<string> GetProjectStateAsync(string projectId); } // 服务实现 public class ProjectService : IProjectService { private readonly ApplicationContext _context; // 构造函数直接注入ApplicationContext,由框架自动完成参数传递 public ProjectService(ApplicationContext context) { _context = context; } // 把重复的业务逻辑移到这里 public async Task<string> GetProjectStateAsync(string projectId) { if (string.IsNullOrWhiteSpace(projectId)) return "Inactive"; if (!int.TryParse(projectId, out int id)) return "Inactive"; var project = await _context.Projects.FindAsync(id); return project?.ProjectState == ProjectState.Active ? "Active" : "Inactive"; } }
2. 服务注册与实例化
不需要手动实例化,直接在ASP.NET Core的服务容器中注册即可,框架会自动处理生命周期和实例创建:
在项目的Program.cs文件中添加服务注册代码:
// 其他服务注册代码之后添加这一行 builder.Services.AddScoped<IProjectService, ProjectService>();
需要使用该服务的页面PageModel中,直接通过构造函数注入即可:
public class YourPageModel : PageModel { private readonly IProjectService _projectService; // 框架自动注入已实例化的服务 public YourPageModel(IProjectService projectService) { _projectService = projectService; } // 页面Handler直接调用服务,不用重复写业务逻辑 public async Task<JsonResult> OnGetProjectAsync(string projectId) { var state = await _projectService.GetProjectStateAsync(projectId); return new JsonResult(state); } }
3. JQuery调用方式
前端无法直接调用后端服务,还是需要通过PageHandler作为入口,有两种可选方案:
- 方案一(兼容原有代码无需修改):每个页面保留自己的Handler,Handler内部调用共用服务,你原来的JQuery代码不需要做任何调整即可正常运行。
- 方案二(共用接口避免重复写Handler):单独创建一个公共的Razor Page作为统一API入口,比如新建
Pages/ProjectApi.cshtml,它的PageModel里只保留上述的OnGetProjectAsyncHandler,所有页面的JQuery都统一调用这个公共接口即可:
$(function () { $("#Position_PositionState").on("change", function () { var projectId = $("#Position_ProjectId").val(); // 调用公共接口地址,所有页面通用 $.getJSON(`/ProjectApi?handler=Project&projectId=${projectId}`, function (response) { // 原有处理逻辑保持不变 if (response === "Inactive") { var state = document.getElementById('Position_PositionState'); for (var i = 0; i < state.options.length; i++) { if (state.options[i].text === response) { state.selectedIndex = i; break; } } } }); }); });
如果多个页面的联动逻辑也完全一致,你还可以把这段JS封装为公共函数,放在wwwroot/js/common.js里,所有需要的页面直接引用即可。
内容的提问来源于stack exchange,提问作者VollerSterne
相关产品推荐
相关产品推荐

