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

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

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

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

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

@Html.Partial("{ViewName}")

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

Ответ 1

Решил это. Чтобы добавить подкаталог "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 Collection в методе Application_Start() в вашем global.asax:

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

Ответ 2

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

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

Ответ 3

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

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

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

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

Ответ 4

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

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

Вы также можете обновить форматы partialview-location зарегистрированного 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();
        }

Ответ 6

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

this.PartialViewLocationFormats = viewLocations;

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

Ответ 7

Если вы делаете это в 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");
    });