asp.net-core - 在布局中访问 .Net Core 部分 View 中的数据的 "right way"是什么?

标签 asp.net-core partial-views dbcontext

我在我的 _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/

相关文章:

ruby-on-rails - 渲染异构集合: How can I specify a single directory for the partials?

c# - 我可以指示 EF DbContext 使用 "real"参数名称吗?

asp.net-mvc - 在 MVC Web 应用程序中跨存储库共享 DbContext

entity-framework - dbcontext 使用 select()、include() 和 where() 加载相关实体不起作用

git - aspnet core项目gitignore的常见做法是什么

c# - MVC 6引用问题

ruby-on-rails - Rails 在 Controller Action 中形成,在另一个 View 中呈现?

asp.net-core - AsyncLocal<T> 没有到达 Controller

javascript - 使用 Ajax/Axios 时从 FileStreamResult 获取文件名?

c# - MVC3 局部 View