You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 23:06:03