C# 如何将数据库中的数据从一个控制器传递到另一个在ASP.NET Core中有自己数据库的控制器?

C# 如何将数据库中的数据从一个控制器传递到另一个在ASP.NET Core中有自己数据库的控制器?,c#,asp.net-mvc,asp.net-core,C#,Asp.net Mvc,Asp.net Core,我有两个控制器: aa控制器有一个名为Index的视图和一个我们可以为dbContextAa调用的数据库上下文 RrController也有自己的数据库,我们可以调用dbContextRr和一个操作方法GetData() 我想知道的是;如果我想从GetData()方法获取数据并将其显示在索引视图中,该怎么办 之前,我使用临时数据和会话进行了测试,但没有任何结果。我在数据库的视图中没有任何价值。 如果我理解正确,我必须使用依赖注入 因此,我在这里创建了依赖项注入(不确定它是否正确) AAA控制器:

我有两个控制器:

aa控制器有一个名为Index的视图和一个我们可以为dbContextAa调用的数据库上下文

RrController也有自己的数据库,我们可以调用dbContextRr和一个操作方法GetData()

我想知道的是;如果我想从GetData()方法获取数据并将其显示在索引视图中,该怎么办

之前,我使用临时数据和会话进行了测试,但没有任何结果。我在数据库的视图中没有任何价值。 如果我理解正确,我必须使用依赖注入

因此,我在这里创建了依赖项注入(不确定它是否正确)

AAA控制器:

public class AaController : Controller
{
    private RrController rc;

    public AaController(RrController rr, AaContext aaContext)
    {
        rc = rr;
        _aaContext = aaContext;
    }

public IActionResult Index()
    {
        var dataFromRr= rs.GetData();

        ViewBag.rrData = dataFromRr;

        return View();
    }
public class RrController : Controller
{
    private readonly RrContext _rrContext;

    public RrController(RrContext rrContext)
    {
        _rrContext = rrContext;
    }

public IActionResult GetData()
    {
        var data = _rrContext.RrData.Count(x => x.Pid == x.Pid);


        return RedirectToAction("Index", "Aa", data );
    }
RRC控制器:

public class AaController : Controller
{
    private RrController rc;

    public AaController(RrController rr, AaContext aaContext)
    {
        rc = rr;
        _aaContext = aaContext;
    }

public IActionResult Index()
    {
        var dataFromRr= rs.GetData();

        ViewBag.rrData = dataFromRr;

        return View();
    }
public class RrController : Controller
{
    private readonly RrContext _rrContext;

    public RrController(RrContext rrContext)
    {
        _rrContext = rrContext;
    }

public IActionResult GetData()
    {
        var data = _rrContext.RrData.Count(x => x.Pid == x.Pid);


        return RedirectToAction("Index", "Aa", data );
    }
我得到的不是视图的值,而是Microsoft.AspNetCore.Mvc.ViewResult


如何解决此问题?

因为
GetData
方法返回
IActionResult
类型响应(特别是MVC操作结果,
RedirectResult

理想情况下,您应该做的是,提取代码,将相关数据提供给单独类中的方法,您可以根据需要在多个位置使用该类(ControllerA和ControllerR)

让我们创建一个接口和一个类来实现它

public interface IRService
{
   int GetRDataCount(int pId);
}

public class RService : IRService
{
   private RrContext _rrContext;     
   public RService (RrContext rrContext)
   {
      this._rrContext=rrContext;
   }  
   public int GetRDataCount(int pId)
   {
     return _rrContext.RrData.Count(x => x.Pid == pId);
   }
} 
您可以将
IRService
实现注入控制器,并调用
GetRDataCount
方法来获取int值

public class AaController : Controller
{
    private IRService rService;

    public AaController(IRService rService)
    {
        this.rService=rService;
    }

    public IActionResult Index()
    {
        int countVal = this.rService.GetRDataCount(234); // pass actual PId

        ViewBag.rrData = countVal;

        return View();
    }    
}
确保在启动类中将
IRservice
添加到
rsservice
依赖关系映射中


现在,无论您想在哪里获取特定pId的RData计数,都可以注入
IRservice
实现并使用它(也可以在
RCController
中执行)

,因为
GetData
方法返回
IActionResult
类型响应(特别是MVC操作结果,
RedirectResult

理想情况下,您应该做的是,提取代码,将相关数据提供给单独类中的方法,您可以根据需要在多个位置使用该类(ControllerA和ControllerR)

让我们创建一个接口和一个类来实现它

public interface IRService
{
   int GetRDataCount(int pId);
}

public class RService : IRService
{
   private RrContext _rrContext;     
   public RService (RrContext rrContext)
   {
      this._rrContext=rrContext;
   }  
   public int GetRDataCount(int pId)
   {
     return _rrContext.RrData.Count(x => x.Pid == pId);
   }
} 
您可以将
IRService
实现注入控制器,并调用
GetRDataCount
方法来获取int值

public class AaController : Controller
{
    private IRService rService;

    public AaController(IRService rService)
    {
        this.rService=rService;
    }

    public IActionResult Index()
    {
        int countVal = this.rService.GetRDataCount(234); // pass actual PId

        ViewBag.rrData = countVal;

        return View();
    }    
}
确保在启动类中将
IRservice
添加到
rsservice
依赖关系映射中


现在,无论您想在哪里获取特定pId的RData计数,都可以注入一个
IRservice
实现并使用它(也可以在
RCController
中执行)

根据项目的结构以及它们之间的通信方式(如果可以),有几种不同的方法

我想知道的是;如果我想从数据库中获取数据,该怎么办 方法GetData()并在索引视图中显示它

您的
GetData()
方法实际上正在尝试自己返回一个视图,但是看起来您想要做的实际上只是返回数据(即计数)并将其传递给其他操作:

public int GetData()
{
    var data = _rrContext.RrData.Count(x => x.Pid == x.Pid);
    // This will pass a parameter that contains your count
    return RedirectToAction("Index", "Aa", new { count = data });
}
实际上,您需要将数据作为“模型”传递给视图。通过简单地用要传递的数据类型装饰视图,可以很容易地做到这一点:

public IActionResult Index(int count)
{
    // The count parameter will have the current result of your previous call in it
    return View(count);
}
然后,您只需通过视图顶部的
@model
指令告诉实际视图您希望如何显示数据(即数据的类型):

@model int

There were @Model records found.
考虑一项服务


更好的实现方式是考虑使用一种将逻辑从任何一个特定控制器中解耦的服务。这将允许您简单地实例化服务,并根据指示从任何需要的地方调用它。

根据项目的结构以及它们之间的通信方式(如果需要),有几种不同的方法

我想知道的是;如果我想从数据库中获取数据,该怎么办 方法GetData()并在索引视图中显示它

您的
GetData()
方法实际上正在尝试自己返回一个视图,但是看起来您想要做的实际上只是返回数据(即计数)并将其传递给其他操作:

public int GetData()
{
    var data = _rrContext.RrData.Count(x => x.Pid == x.Pid);
    // This will pass a parameter that contains your count
    return RedirectToAction("Index", "Aa", new { count = data });
}
实际上,您需要将数据作为“模型”传递给视图。通过简单地用要传递的数据类型装饰视图,可以很容易地做到这一点:

public IActionResult Index(int count)
{
    // The count parameter will have the current result of your previous call in it
    return View(count);
}
然后,您只需通过视图顶部的
@model
指令告诉实际视图您希望如何显示数据(即数据的类型):

@model int

There were @Model records found.
考虑一项服务

更好的实现方式是考虑使用一种将逻辑从任何一个特定控制器中解耦的服务。这将允许您简单地实例化服务,并根据指示从任何需要的地方调用它