我有两个控制器:
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。
我该如何解决这个问题?
答案 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();
}
}
确保在启动类中添加IRservice
到RService
依赖关系映射。
现在,无论您想要获取特定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指示的任何地方调用它。