Как я могу изменить, где ASP.NET Core ищет ViewComponents? - PullRequest
0 голосов
/ 16 декабря 2018

Я хочу упорядочить папки компонентов так, чтобы это имело смысл для меня.Проблема в том, что когда я это сделаю, компоненты не найдены ASP.NET.Их можно найти только тогда, когда я помещу их в Shared / Components или Views / {NameOfView} / Components.Есть ли способ настроить это?

Ответы [ 2 ]

0 голосов
/ 17 декабря 2018

Хотя официальный документ не содержит описания того, как настраивать расположение компонентов представления, вы все равно можете следовать этим учебникам о том, как это сделать с простыми файлами View.

Короче говоря:

  1. Вам нужно настроить RazorViewEngineOptions параметры, чтобы сообщить Razor, где находятся файлы вашего просмотра
  2. Кроме того, вам нужно создать папку Components/YourViewComponentName/, чтобы сообщить Razor, что этогде располагаются ваши компоненты представления.

Как это сделать подробно

Предположим, вы хотите создать компонент представления, который бы отображал разные файлы представления разных тем:

public class MyViewComponent : ViewComponent
{
    public async Task<IViewComponentResult> InvokeAsync( string template, string theme)
    {
        template = string.IsNullOrEmpty(template) ? "Default": template; 
        theme = string.IsNullOrEmpty(theme) ? "" : "." +theme;
        return View(template+theme);
    }
}

Вы можете поместить этот файл куда угодно.В целях тестирования я создаю папку, как показано ниже:

Your project folder/
    App.csproj
    MyLocations/
        MyViewComponent.cs                     # MyViewComponent class 
        DefaultTheme/
            Components/                        # The name of `Components` here matters
                My/                            # Your ViewComponentName
                    Default.cshtml             # view file of your view component
                    Another.cshtml             # view file of your view component
        Theme2/
            Components/                        # The name of `Components` here matters
                My/                            # Your ViewComponentName
                    Default.Theme2.cshtml      # view file of your view component
                    Another.Theme2.cshtml      # view file of your view component
    Views/
    Controllers/

Обратите внимание, что имя папки My должно соответствовать имени компонента представления.Если вы задаете имя Our, имя папки также следует изменить.

Чтобы оно работало, просто добавьте конфигурацию для RazorViewEngineOptions:

services.Configure<RazorViewEngineOptions>(o =>{
    o.ViewLocationFormats.Add("MyLocations/DefaultTheme/{0}" + RazorViewEngine.ViewExtension);
    o.ViewLocationFormats.Add("MyLocations/Theme2/{0}" + RazorViewEngine.ViewExtension);
});

Вот и все.

0 голосов
/ 16 декабря 2018

Согласно документам Microsoft :

Среда выполнения ищет представление компонента View по следующим путям:

/Pages/Components/{View Component Name}/{View Name}

/Views/{Controller Name}/Components/{View Component Name}/{View Name}

/Views/Shared/Components/{View Component Name}/{View Name}

Имя представления по умолчанию для компонента представления - Default, что означает, что ваш файл представления обычно будет иметь имя Default.cshtml.Вы можете указать другое имя представления при создании результата компонента представления или при вызове метода View.

Мы рекомендуем назвать файл представления Default.cshtml и использовать путь Views/Shared/Components/{View Component Name}/{View Name}.

Хотя среда выполнения может выполнять поиск по вышеуказанным трем путям, но Microsoft предлагает использовать следующий путь среди этих трех:

/Views/Shared/Components/{View Component Name}/{View Name}

И это имеет смысл!Потому что ViewComponent на самом деле является общей частью представления, которую можно использовать в любом месте приложения от страницы макета до любой отдельной страницы.Так что по характеристикам его всегда следует размещать внутри общей папки.

Спасибо.

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