Модель представления макета порта для ядра Asp.Net - PullRequest
0 голосов
/ 18 июня 2019

Я портирую свое приложение электронной коммерции ASP.NET на ASP Net Core.В моем приложении я использовал LayoutViewModel и заполнял его в базовом контроллере (например, категории, потому что категории необходимы всем представлениям), чтобы я мог использовать его в _Layout.cshtml.Как я могу перенести эту структуру в ASP.NET Core или у вас есть какие-либо предложения?Я использую промежуточное ПО или?

Спасибо.

    public class BaseController : Controller
    {
        protected override IAsyncResult BeginExecute(HttpContext requestContext, 
                                AsyncCallback callback, 
                                object state)
        {

            ...

            var layoutViewModel = new LayoutViewModel
            {
                Categories = Categories,

            };

            ViewBag.LayoutViewModel = layoutViewModel;
            ...

        }
    }


    public class HomeController:BaseController
    {
        public ActionResult Index()
        {
            var myHomeViewModel= new MyHomeViewModel{Prop="Test"};

            return View(myHomeViewModel);
        }
    }


    //In _Layout.cshtml

    @{
        var layoutViewModel = (LayoutViewModel)ViewBag.LayoutViewModel
    }
    <div class="container">
        <div class="header">
            For Example Categories Count: @layoutViewModel.Categories.Count
        </div>

        <div class="body">
            @RenderBody()
        </div>

        <div class="footer">
        </div>
    </div>

1 Ответ

0 голосов
/ 19 июня 2019

В ASP.Net Core вы можете использовать Просмотр компонентов , чтобы определить логику для получения данных в методе InvokeAsync и визуализации их в частичном представлении.

Другой вариант заключается виспользуйте ActionFilter.Например, если у вас есть модель представления:

public class MainLayoutViewModel
{
    public string PageTitle { get;  set; }
}

Создание ActionFilter class:

public class CommonViewBagInitializerActionFilter : ActionFilterAttribute
{
    public override void OnResultExecuting(ResultExecutingContext context)
    {

        ((Controller)context.Controller).ViewBag.MainLayoutViewModel = new MainLayoutViewModel() {
            PageTitle = "MyTitle"
    };

    }
}

Зарегистрируйте фильтр в функции ConfigureServices:

services.AddMvc(config =>
{
    config.Filters.Add(new CommonViewBagInitializerActionFilter());
}).SetCompatibilityVersion(CompatibilityVersion.Version_2_2);

А у тебя _Layout.cshtml:

@{
    var viewModel = (MainLayoutViewModel)ViewBag.MainLayoutViewModel;
}

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