Net core 2.0 - частичное представление Razor Pages с самим бизнесом (не MVC) - PullRequest
0 голосов
/ 30 апреля 2018

У меня есть вид боковой панели как частичный вид. Я хочу вставить его на главную страницу. Боковая панель считывает некоторые изображения из базы данных и отображает их на html-странице. На главной странице я использовал этот код для вставки боковой панели:

@await Html.PartialAsync("Shared/_Sidebar")

Страница cshtml боковой панели:

@model MyWeb.Pages.Shared._SidebarModel
...

Но возникает ошибка:

The model item passed into the ViewDataDictionary is of type 'MyWeb.Pages.IndexModel', but this ViewDataDictionary instance requires a model item of type 'MyWeb.Pages.Shared._SidebarModel'

Я исследовал эту проблему, и получил ответ: должен передать модель с родительской страницы, например:

@await Html.PartialAsync("Shared/_Sidebar", Model.Urls)

Если это так, родительская страница должна обрабатывать бизнес дочерней страницы. Таким образом, если я не вставляю боковую панель на главную страницу, а на другую страницу, я должен удалить код на главной странице, добавить бизнес-код на новую страницу и т. Д. Боковая панель не может обрабатывать свой бизнес. В MVC мы можем использовать RenderAction для вставки частичного представления с его действием в бизнес-логику обработчика. Но я не нашел способ сделать это в RazorPages. Кто-нибудь, помогите мне!

1 Ответ

0 голосов
/ 30 апреля 2018

Есть несколько способов, включая передачу его как ViewData. Я обнаружил, что инъекция - один из самых чистых способов:

Инициализируйте ваш _SidebarModel как службу. Это может быть ограничено, если вы планируете использовать с ним какой-либо сервис (например, DBContext). Вы можете использовать это в своем классе запуска:

services.AddSingleton<_SidebarModel>();

Или, если вы хотите инициализировать его здесь:

services.AddSingleton<>(new _SidebarModel { });

Теперь вместо @model MyWeb.Pages.Shared._SidebarModel вы можете использовать:

@inject MyWeb.Pages.Shared._SidebarModel MyModel

Вы также можете всегда вводить и контролировать модель из моделей вашего вида.

Вы можете добавить некоторые базовые функциональные возможности, используя модели просмотра страниц с таким классом:

public class InjectablePage : PageModel
{
    private readonly HttpContext httpContext;

    public InjectablePage(HttpContext httpContext)
    {
        this.httpContext = httpContext;
        if (httpContext.Request.Method == "GET") OnGet();
    }

    public virtual void OnGet() { }

}

Вы можете расширить это вместо PageModel в _SidebarModel

...