Добавление подкаталога в папку «View / Shared» в ASP.Net MVC и вызов представления - PullRequest
48 голосов
/ 11 февраля 2011

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

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

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

У меня вопрос: есть ли способ добавить папку «Partials» в список, через который проходит .Net при поиске представления, таким образом я могу вызвать свое представление, не обращаясь к папке «Partials», например: так:

@Html.Partial("{ViewName}")

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

Ответы [ 7 ]

65 голосов
/ 14 февраля 2011

Решил это. Чтобы добавить подкаталог «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} является именем представления.

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

ViewEngines.Engines.Add(new RDDBViewEngine()); 
28 голосов
/ 10 августа 2011

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

ViewEngines.Engines.Add(new RazorViewEngine
{
    PartialViewLocationFormats = new string[]
    {
        "~/Views/{1}/Partials/{0}.cshtml",
        "~/Views/Shared/Partials/{0}.cshtml"
    }
});
16 голосов
/ 01 июля 2012

Приятно настроить движок представления, но если вы просто хотите иметь подпапку для партиалов, вам не нужно так много ...

Просто используйте полный путь к частичному представлениюкак сделано для Layout View:

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

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

6 голосов
/ 11 апреля 2014

Я обновил отличный ответ ламаранта, чтобы включить Области:

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");
        }
    }
}

Тогда не забудьте включить в ваше приложение запуск:

public class MvcApplication : System.Web.HttpApplication
{

    protected void Application_Start()
    {
        ...

        ViewEngines.Engines.Add(new RDDBViewEngine()); 
    }
}
5 голосов
/ 18 апреля 2017

Если вы делаете это в 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");
    });
5 голосов
/ 10 июля 2013

Вы также можете обновить форматы частичного просмотра местоположения зарегистрированного RazorViewEngine. Поместите приведенный ниже код в Application_Start в Global.asax.

 RazorViewEngine razorEngine = ViewEngines.Engines.OfType<RazorViewEngine>().FirstOrDefault();
        if (razorEngine != null)
        {
            string[] newPartialViewFormats = new[] { 
                    "~/Views/{1}/Partials/{0}.cshtml",
                    "~/Views/Shared/Partials/{0}.cshtml"
            };
            razorEngine.PartialViewLocationFormats =
                razorEngine.PartialViewLocationFormats.Union(newPartialViewFormats).ToArray();
        }
1 голос
/ 11 февраля 2011

Вы можете создать собственный регистрационный движок, который создается из любого используемого вами движка просмотра (Webforms / Razor), и указать любые местоположения, которые вы хотите в конструкторе, или просто добавить их в список уже существующих местоположений:

this.PartialViewLocationFormats = viewLocations;

Затем при запуске приложения вы добавляете движок вида так: ViewEngines.Engines.Add(new MyViewEngineWithPartialPath());

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