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

时间:2017-03-11 20:35:55

标签: c# asp.net-mvc 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。

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

因为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依赖关系映射。

现在,无论您想要获取特定pId的RData计数,您都可以注入IRservice实施并使用它(也可以在RController中执行此操作)

答案 1 :(得分:1)

根据项目的结构以及他们如何(以及如何)彼此沟通,有一些不同的方法。

  

我想知道的是什么;如果我想从中获取数据,该怎么办?   方法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 });
}

您需要实际将数据作为"模型"传递给View。只需使用您要传入的数据类型修饰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's answer指示的任何地方调用它。