Визуализация частичного представления в _layout.cshtml с использованием экземпляра модели частичного просмотра с внедрением зависимости DBContext - PullRequest
0 голосов
/ 25 августа 2018

Сначала я хотел бы сказать, что я новичок в Asp.net Core, а также с концепциями внедрения зависимостей (DI).Я читаю много, пытаясь понять это, поэтому я прошу терпения.

Я пытаюсь использовать Razor Pages (не MVC), и моя цель - сделать "_layout.cshtml" частичным представлением, в котором информация, полученная с помощью Entity Framework, доступна на всех страницах.

Я добавил DBContext в файл Startup.cs следующим образом:

  services.AddDbContext <AppDBContext> (options =>
  options.UseSqlServer (Configuration.GetConnectionString ("AppDBContext")

И в «PageModel» для MenuPartial.cshtml.cs

 public class MenuPartialModel: PageModel
    {
       
       private readonly AppDBContext _db;
      

        public MenuPartialModel (AppDBContext db)      
        {
            _db = db;
        }
                 
}

В файле _layout.cshtm я пробовал несколько способов вызова PartialAsync с экземпляром новой модели:

Если установить новую модель экземпляра, как показано ниже, я буду использовать конструктор без параметров, поэтому DbContext не вводится

@await Html.PartialAsync ("MenuPartial", new MenuPartialModel ())

И я также подумал об использовании:

@await Html.PartialAsync ("MenuPartial", new MenuPartialModel (new AppDBContext ())

Я считаю, что это не будет правильным подходом.Потому что, если DbContext был внедрен автоматически, зачем мне выполнять новый экземпляр, передавая параметры соединения еще раз?

Каков наилучший подход для достижения моей цели?Я подумал об использовании ViewComponents, однако сначала хотел бы понять, есть ли способ создания экземпляра модели и использования конструктора, который внедряет DBContext.

1 Ответ

0 голосов
/ 25 августа 2018

Я хотел бы понять, есть ли способ создания экземпляра модели и использования конструктора, который внедряет DBContext.

В ASP.NET Core MVC - простые старые классы CLR (POCO) не участвуют в внедрении основных зависимостей ASP.NET.MenuPartialModel - это POCO (как и большинство моделей MVC).В результате платформа не будет автоматически вставлять в нее зависимости.

Некоторые встроенные классы ASP.NET Core MVC подключены к внедрению зависимости.К ним относятся (но не ограничиваются ими):

  • Контроллеры,
  • Помощники тегов,
  • Представления Razor,
  • Страницы Razor и
  • Просмотр компонентов.

Канонический подход в MVC состоит в том, чтобы ввести зависимости (или службы) в одну из них, а затем передать любые данные вручную в модель POCO.

Что быбыть [хорошим] подходом для достижения моей цели?

Вместо частичного просмотра я бы использовал Просмотр компонента .Компонент вида подобен частичному виду, у которого есть модель, вид и контроллер.

Контроллером является InvokeAsync, который не доступен для HTTP, но он все еще является контроллером в традиционном смысле , потому что он отвечает за привязку модели к представлению.

Компонент базового вида с внедрением зависимостей

using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using MyApplication.Data;

public class MenuModel
{
    public string MyProperty { get; set; }
    public string MyOtherProperty { get; set; }
}

public class MenuViewComponent : ViewComponent
{
    private readonly ApplicationDbContext dbContext;

    public MenuViewComponent(ApplicationDbContext dbContext)
    {
        this.dbContext = dbContext;
    }

    public async Task<IViewComponentResult> InvokeAsync()
    {
        var data = await dbContext...

        var model = new MenuModel 
        {
            MyProperty = data.FirstValue,
            MyOtherProperty = data.OtherValue,
        };

        return View(model);
    }
}

Вам также понадобится файл Razor в одном из этих мест, чтобы он выступал в качестве вида.

/Pages/Shared/Components/Menu/Default.cshtml
/Views/Shared/Components/Menu/Default.cshtml

То *Файл 1043 * будет содержать что-то вроде этого:

@model MenuModel

<p>@Model.MyProperty</p>
<p>@Model.MyOtherProperty</p>

Использование компонента View

@await Component.InvokeAsync("Menu")

Доступ к компоненту View с помощью AJAX

Из коробки, View Componentsне подвергаются HTTP.Чтобы получить к ним доступ через AJAX, нам нужно добавить ASP.NET Core MVC Controller, чтобы связаться с ними .

[Route("component/[action]")]
public class ViewComponentController : Controller 
{ 
    // ~/component/menu
    public IActionResult Menu() => ViewComponent("Menu");
}
...