ASP. NET Основная модель заполнения только один раз для всех представлений - PullRequest
1 голос
/ 13 марта 2020

Я новичок в ASP. Net Core (в данном случае 3.0), и я пытаюсь создать меню, которое будет отображаться во всех представлениях веб-приложения, создается динамически и должно быть заполнено только один раз. , Ниже я объясняю шаги и пробные выходы, которые я сделал для достижения необходимой цели (при необходимости я могу поделиться кодом, который я использую).

Это то, что я сделал:

  1. Проще говоря, используя страницу "_Layout.cs html", я создал меню stati c HTML и заставил все другие представления просто наследовать этот макет. Пока все хорошо;
  2. Следующая проблема возникает из-за того, что пункты меню создаются динамически после входа пользователя в систему, что мне удалось преодолеть, установив ModelView внутри контроллера (HomeController.cs с помощью Index действие в данном случае), а затем доставить его в представление. В этом случае работает нормально, поскольку страница по умолчанию - ~\Home\Index\, проблема заключается в том, что когда я переключаюсь на другое представление с другим контроллером, меню должно отображаться снова, и поэтому мне приходится копировать код (возникла проблема создания BaseController и BaseModel на основе этого поста рядом с OnActionExecuted для размещения кода, генерирующего меню)
  3. Теперь самая большая проблема заключается в том, что я могу заполнить меню только один раз, после входа пользователя в систему. Каждый раз, когда происходит переадресация между различными контроллерами / представлениями (постбэк одного и того же контроллера / представления работает нормально), модель равна нулю внутри OnActionExecuted, я пытался использовать ViewData, ViewBag, TemData, но все они равны нулю.

Итак, мой вопрос заключается в том, как сохранить эти указанные c данные живыми и общими, в основном по всем представлениям, и заполняется только один раз (после каждого входа пользователя) между перенаправлениями из разных представлений? Я читал вокруг и нашел несколько решений, кроме того, которое я сделал, но я не нашел ни одного, который мог бы поддерживать данные во время сеанса пользователя так, как мне нужно:

Подводя итог, мой поток в этот момент выглядит следующим образом:

  1. User Logged- в
  2. Перенаправление на значение по умолчанию: ~\Home\Index
  3. MenuModelView.cs для меню создается и HomeController.cs возвращается к Index.cshtml с подключенной к нему моделью.
  4. Index.cshtml получает заполненный ModelView и использует _Layout.cshtml
  5. _Layout.cshtml создает теги HTML для меню на основе данных MenuModelView.cs
  6. Пользователь переходит к другому view и шаги с 3 по 5 повторяются с указанного c контроллера / view

1 Ответ

0 голосов
/ 13 марта 2020

Если вы хотите создать элемент управления, который будет доступен на всех страницах без изменения каждого контроллера, я настоятельно рекомендую создать компонент представления. Поскольку view component не имеет отношения к вашему контроллеру, но может получить доступ к таким зависимостям, как база данных и полный HTTP-контекст.

Например, если вы хотите создать собственное навигационное меню, вы можете просто создать компонент представления с именем NavHeader

using Microsoft.AspNetCore.Mvc;

namespace YourProject.Views.Shared.Components.NavHeader 
{
    public class NavHeader : ViewComponent
    {
        public NavHeader(YourDbContext context)
        {
             // you can access your dependencies, like database.
        }

        public IViewComponentResult Invoke()
        {
            // your own logic. You can access HTTPContext here.
            var model = new YourOwnModel();
            return View(model);
        }
    }
}

И просто назовите его в любом представлении или макете.

<!DOCTYPE html>
<html>
<head>
    <title>Example</title>
</head>
<body>
    @*Render your component like this*@
    <vc:nav-header></vc:nav-header>
</body>

Для получения дополнительной информации о компоненте представления, пожалуйста, обратитесь:

https://docs.microsoft.com/en-us/aspnet/core/mvc/views/view-components?view=aspnetcore-3.1

https://anduin.aiursoft.com/post/2020/1/4/share-view-component-between-different-aspnet-core-web-project

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...