我在我的 _Layout.cshtml 中调用了一个名为 _SponsorPartial.cshtml 的局部 View ,因此它位于每个页面上:
<footer>
<div class="visible-xs-inline-block">
@await Html.PartialAsync("_SponsorPartial")
</div>
</footer>
我正在使用 .Net 核心,所以我已经准备好将 dbContext 注入(inject)到我需要的地方:
public void ConfigureServices(IServiceCollection services)
{
services.AddEntityFramework()
.AddSqlServer()
.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(Configuration["Data:DefaultConnection:ConnectionString"]));
[...]
}
_SponsorPartial 是基于不同页面上不同值的图像引导轮播(数据库驱动)。我可以很容易地构建一个函数来根据参数获取我的列表:
public static List<SomeObject> GetObjects(int myParameter)
我最初的想法是在部分页面中访问@ViewData["myParameter"],然后让部分页面从函数中获取适当的信息。
问题是......如何在某个可以访问上下文对象的类中创建一个函数?特别是 ApplicationDbContext。我怎么称呼它?!在 Controller 中,我知道我可以注入(inject) ApplicationDbContext 并传递它......但这是一个部分页面......在布局中。
最大的问题当然是......在 .Net Core (MVC) 环境中执行此操作的“正确”方法是什么?从隐藏在站点上几乎每个 Controller 显示的布局中的部分 View 中访问数据库驱动信息的正确方法是什么?
最佳答案
正如乔在第二条评论中所说,查看组件完全适合您的情况。我试图展示如何在你的情况下实现它。
首先在 _Layout 更改页 footer 分,如下所示:
<footer>
<div class="visible-xs-inline-block">
@Component.Invoke("SponsorComponent", ViewData["Parameter"])
</div>
</footer>
在页面中(我想你有第 1 页,第 2 页):Page1.cshtml
@{
ViewData["Title"] = "Page 1";
ViewData["Parameter"] = <Parameter1>;
}
Page2.cshtml@{
ViewData["Title"] = "Page 2";
ViewData["Parameter"] = <Parameter2>;
}
现在,为组件创建一个 View 模型public class SponsorViewModel
{
// properties
}
然后,在组件文件夹(Views/Shared/Components/SponsorComponent/)中创建Default.cshtml@model SponsorViewModel
@* Compoent Content *@
最后,创建 View Component 类:[ViewComponent(Name = "SponsorComponent")]
public class SponsorViewComponent : ViewComponent
{
private readonly DbContext _context; // if you want to inject dbcontext
public SponsorViewComponent(DbContext context)
{
_context = context;
}
public IViewComponentResult Invoke(object parameter)
{
var model = new SponsorViewModel();
// get data from db
return View(model);
}
}
关于asp.net-core - 在布局中访问 .Net Core 部分 View 中的数据的 "right way"是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36485417/