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

如何在ASP.NET Core中从一个控制器调用另一个控制器的方法并获取返回值?

解决Controller间调用Action获取返回值的类型错误问题

你遇到的错误是因为RedirectToAction的作用是重定向到另一个Action方法,它返回的是RedirectToActionResult类型(属于IActionResult子类),而非你期望的ParentModel,直接赋值必然出现类型不匹配问题。

推荐方案:提取业务逻辑到服务层(解耦且符合MVC设计)

MVC架构中,Controller的职责是处理HTTP请求、调用业务逻辑、返回结果,核心业务逻辑应该抽离到独立服务层,方便多Controller复用,也便于维护和测试。

步骤1:创建业务服务

定义服务接口和实现类,将GetParentModel中的核心逻辑迁移至此:

public interface IParentModelService
{
    Task<ParentModel> GetParentModelAsync(string contractNumberPar);
}

public class ParentModelService : IParentModelService
{
    // 若需要依赖(如数据库上下文),通过构造函数注入
    public async Task<ParentModel> GetParentModelAsync(string contractNumberPar)
    {
        try
        {
            // 原ControllerA中的业务逻辑代码
            var viewModel = new ParentModel
            {
                // 赋值逻辑
            };
            return viewModel;
        }
        catch (Exception ex)
        {
            throw;
        }
    }
}

步骤2:注册服务

在项目的Program.cs中注册该服务:

builder.Services.AddScoped<IParentModelService, ParentModelService>();

步骤3:修改ControllerA和ControllerB

修改ControllerA,通过依赖注入调用服务:

public class ControllerA : Controller
{
    private readonly IParentModelService _parentModelService;

    public ControllerA(IParentModelService parentModelService)
    {
        _parentModelService = parentModelService;
    }

    [HttpGet]
    public async Task<ParentModel> GetParentModel(string contractNumberPar)
    {
        return await _parentModelService.GetParentModelAsync(contractNumberPar);
    }
}

ControllerB中同样注入服务,直接获取ParentModel:

public class ControllerB : Controller
{
    private readonly IParentModelService _parentModelService;

    public ControllerB(IParentModelService parentModelService)
    {
        _parentModelService = parentModelService;
    }

    public async Task<IActionResult> YourAction(string contractNumber)
    {
        // 直接调用服务获取模型
        ParentModel viewModel = await _parentModelService.GetParentModelAsync(contractNumber);
        
        // 后续处理逻辑(如返回视图、其他操作)
        return View(viewModel);
    }
}

备选方案:直接调用ControllerA的方法(不推荐)

若不想抽离服务,可直接实例化ControllerA并调用其方法,但需注意Controller的依赖注入问题:

public class ControllerB : Controller
{
    private readonly ControllerA _controllerA;

    // 若ControllerA有依赖(如DbContext),需在构造函数中传入对应实例
    public ControllerB(/* 注入ControllerA所需依赖,如YourDbContext dbContext */)
    {
        _controllerA = new ControllerA(/* 传入依赖实例 */);
    }

    public async Task<IActionResult> YourAction(string contractNumber)
    {
        ParentModel viewModel = await _controllerA.GetParentModel(contractNumber);
        // 后续处理
        return View(viewModel);
    }
}

注意:这种方式不推荐,Controller是为处理HTTP请求设计的,直接实例化可能导致依赖处理不完整,也违反单一职责原则,不利于代码维护。

内容的提问来源于stack exchange,提问作者Michael1834

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 08:15:32