繁体   English   中英

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

[英]How do I pass data from a database from one controller to another controller that has its own database in ASP.NET Core?

我有两个控制器:

AaController有一个名为Index的视图和一个数据库上下文,我们可以将其称为dbContextAa

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

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

以前,我使用Temp Data和Sessions进行测试,但没有任何结果。 在RrDatabase的视图中,我根本没有任何价值。 如果我理解正确,则必须使用依赖项注入。

所以在这里我创建了依赖项注入(不确定是否正确)

AaController:

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();
    }

RrController:

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();
    }    
}

确保添加IRserviceRService在启动类依赖映射。

现在,无论你想要得到的RDATA计数特定PID,你可以注入IRservice实施和使用它(做它在你的RController为好)

有几种不同的方法,具体取决于您的项目的结构以及它们之间如何(以及是否可以)进行通信。

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

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

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 });
}

您实际上需要将数据作为“模型”传递给视图。 只需用将要传递的数据类型装饰View即可轻松实现:

public IActionResult Index(int count)
{
    // The count parameter will have the current result of your previous call in it
    return View(count);
}

然后,您只需要通过视图顶部的@model指令告诉实际的View您希望如何呈现数据(即,数据是什么类型):

@model int

There were @Model records found.

考虑服务

更好的实现方法是考虑使用一种将您的逻辑与任何一个特定控制器分离的服务。 这将使您可以简单地实例化该服务,并根据Shyju的回答从需要的任何地方调用它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM