在布局中访问.Net Core局部视图中的数据的“正确方法”是什么?

时间:2016-04-07 19:26:34

标签: asp.net-core partial-views dbcontext

我在_Layout.cshtml中调用了一个名为_SponsorPartial.cshtml的局部视图,因此它位于每个页面上:

    <footer>
        <div class="visible-xs-inline-block">
            @await Html.PartialAsync("_SponsorPartial")
        </div>
    </footer>

我正在使用.Net核心,所以我准备好将dbContext注入我需要的地方:

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddEntityFramework()
            .AddSqlServer()
            .AddDbContext<ApplicationDbContext>(options =>
                options.UseSqlServer(Configuration["Data:DefaultConnection:ConnectionString"]));
       [...]
    }

_SponsorPartial是基于不同页面上不同值的图像(数据库驱动)的Bootstrap轮播。我可以很容易地构建一个函数来根据参数获取我的列表:

 public static List<SomeObject> GetObjects(int myParameter)

我最初的想法是在部分页面中访问@ViewData [“myParameter”],然后让部分页面从函数中获取适当的信息。

问题是......如何在某个可以访问上下文对象的类中创建一个函数?特别是ApplicationDbContext。我怎么称呼它?!在一个控制器中,我知道我可以注入ApplicationDbContext并传递它...但这是一个部分页面......在布局中。

当然,最重要的问题是......在.Net Core(MVC)环境中执行此操作的“正确”方法是什么?从隐藏在网站上几乎每个控制器所显示的布局中的部分视图中访问数据库驱动信息的正确方法是什么。

1 个答案:

答案 0 :(得分:1)

正如Joe在第二条评论中所说,View Components完全适合您的情况。我试着在你的情况下如何实现它。

首先在_Layout更改页脚部分如下:

<footer>
  <div class="visible-xs-inline-block">
     @Component.Invoke("SponsorComponent", ViewData["Parameter"])
  </div>
</footer>

在页面中(我猜你有Page1,Page2):

Page1.cshtml

@{
    ViewData["Title"] = "Page 1";
    ViewData["Parameter"] = <Parameter1>; 
}

Page2.cshtml

@{
    ViewData["Title"] = "Page 2";
    ViewData["Parameter"] = <Parameter2>; 
}

现在,为组件

创建一个视图模型
public class SponsorViewModel
{
     // properties
}

然后,在组件文件夹中创建Default.cshtml(Views / Shared / Components / SponsorComponent /)

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