0

Добавление подпапки в папку "View/Shared" в ASP.Net MVC и вызов представления

10

Я разрабатываю сайт на ASP.Net MVC3 с использованием Razor. В папке "View/Shared" я хочу создать подпапку "Partials", где буду размещать все свои частичные представления для лучшей организации сайта.

Я могу сделать это без проблем, если всегда указываю путь к папке "Partials", вызывая представления (с помощью Razor):

@Html.Partial("Partials/{ViewName}")

Мой вопрос: есть ли способ добавить папку "Partials" в список, который .Net использует при поиске представлений? Таким образом, я мог бы вызывать свое представление без необходимости указывать путь к папке "Partials", как это:

@Html.Partial("{ViewName}")

Спасибо за помощь!

5 ответ(ов)

0

Если вы работаете с ASP.NET Core, просто перейдите в класс Startup, в метод ConfigureServices и добавьте следующий код:

services.AddMvc()
    .AddRazorOptions(opt => {
        opt.ViewLocationFormats.Add("/Views/{1}/Partials/{0}.cshtml");
        opt.ViewLocationFormats.Add("/Views/Shared/Partials/{0}.cshtml");
    });

Этот код добавляет путь для поиска частичных представлений в ваших проектах, позволяя вам организовать файлы более удобно.

0

Решил эту задачу. Чтобы добавить подкаталог "Shared/Partials" в список мест, где происходит поиск частичных представлений в Razor с помощью:

@Html.Partial("{NameOfView}")

Сначала создайте новый класс представления, основанный на RazorViewEngine, и добавьте свои пути для представлений следующим образом. Я хотел хранить все свои частичные представления в подкаталоге "Partials", который я создал в стандартном каталоге "Views/Shared", созданном MVC.

public class RDDBViewEngine : RazorViewEngine
{
    private static readonly string[] NewPartialViewFormats = 
    { 
        "~/Views/{1}/Partials/{0}.cshtml",
        "~/Views/Shared/Partials/{0}.cshtml"
    };

    public RDDBViewEngine()
    {
        base.PartialViewLocationFormats = base.PartialViewLocationFormats.Union(NewPartialViewFormats).ToArray();
    }       
}

Обратите внимание, что {1} в формате пути обозначает имя контроллера, а {0} – имя представления.

Затем добавьте этот класс представления в коллекцию ViewEngines.Engines в методе Application_Start() вашего global.asax:

ViewEngines.Engines.Add(new RDDBViewEngine()); 

Это позволит вашей MVC-программе находить частичные представления в указанной директории.

0

Спасибо за ваши ответы! Это помогло организовать мою общую папку, но почему вы создаете новый тип движка представлений? Я просто создал новый RazorViewEngine, установил его PartialViewLocationFormats и добавил его в список ViewEngines.

ViewEngines.Engines.Add(new RazorViewEngine
{
    PartialViewLocationFormats = new string[]
    {
        "~/Views/{1}/Partials/{0}.cshtml",
        "~/Views/Shared/Partials/{0}.cshtml"
    }
});

На самом деле, ваш подход вполне разумен и может работать без создания нового типа движка представлений. Однако создание нового класса может быть полезным в следующих ситуациях:

  1. Расширяемость: Если вам в будущем потребуется добавить дополнительные настройки или изменить поведение вашего движка, то создание наследника даст вам гибкость не изменять существующий код.

  2. Четкость кода: Определение нового класса для специфичных настроек может сделать код более понятным и структурированным, особенно если проект становится большим.

  3. Избежание конфликтов: Когда вы настраиваете стандартные движки, всегда есть риск конфликта с тем, как они уже заведомо настроены. Создание своего собственноручного движка позволяет избежать неожиданных проблем.

В общем, в зависимости от ваших нужд, использование нового класса может быть более предпочтительным, но если текущий подход работает для вас, можете его вполне использовать!

0

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

Просто укажите полный путь к частичному представлению, как это делается для представления макета:

@Html.Partial("/Views/Shared/Partial/myPartial.cshtml")

Надеюсь, это поможет кому-то...

0

Вот обновленный ответ на ваш вопрос с учетом поддержки областей в классе RDDBViewEngine:

public class RDDBViewEngine : RazorViewEngine
{
    private static readonly string[] NewPartialViewFormats =
    {
        "~/Views/{1}/Partials/{0}.cshtml",
        "~/Views/Shared/Partials/{0}.cshtml"
    };

    private static List<string> AreaRegistrations;

    public RDDBViewEngine()
    {
        AreaRegistrations = new List<string>();

        BuildAreaRegistrations();

        base.PartialViewLocationFormats = base.PartialViewLocationFormats.Union(NewPartialViewFormats).ToArray();
        base.PartialViewLocationFormats = base.PartialViewLocationFormats.Union(AreaRegistrations).ToArray();
    }

    private static void BuildAreaRegistrations()
    {
        string[] areaNames = RouteTable.Routes.OfType<Route>()
            .Where(d => d.DataTokens != null && d.DataTokens.ContainsKey("area"))
            .Select(r => r.DataTokens["area"].ToString()).ToArray();

        foreach (string areaName in areaNames)
        {
            AreaRegistrations.Add("~/Areas/" + areaName + "/Views/Shared/Partials/{0}.cshtml");
            AreaRegistrations.Add("~/Areas/" + areaName + "/Views/{1}/Partials/{0}.cshtml");
        }
    }
}

Не забудьте зарегистрировать ваш новый класс RDDBViewEngine в методе Application_Start:

public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        ...

        ViewEngines.Engines.Add(new RDDBViewEngine()); 
    }
}

Таким образом, вы сможете использовать частичные представления как в основных представлениях, так и в областях вашего приложения.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь