Как организовать проект ASP.NET 6 в структуре «Папка по функциям»?C#

Место общения программистов C#
Ответить
Anonymous
 Как организовать проект ASP.NET 6 в структуре «Папка по функциям»?

Сообщение Anonymous »

Структура папок по типам по умолчанию мне слишком сложна. Поэтому я пытаюсь адаптировать его к структуре папок за функциями. При этом я не могу переименовать папку «Области» в другое имя.

Код: Выделить всё

using System.Diagnostics;
using Microsoft.AspNetCore.Mvc.Razor;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure;
using Microsoft.Extensions.Options;
var builder = WebApplication.CreateBuilder(args);

string CombinePath(string path1, string path2)
{
if (path1.EndsWith("/", StringComparison.Ordinal) || path2.StartsWith("/", StringComparison.Ordinal))
{
return path1 + path2;
}
else if (path1.EndsWith("/", StringComparison.Ordinal) && path2.StartsWith("/", StringComparison.Ordinal))
{
return string.Concat(path1, path2.AsSpan(1));
}

return path1 + "/" + path2;
}

// Add services to the container.
builder.Services.AddMvc();
//  .AddRazorPagesOptions(option => { })
// builder.Services.AddMvc().AddRazorPagesOptions(options =>
//  {

//      options.RootDirectory = $"/Areas/{{2}}/{{1}}/Pages/{{0}}.cshtml";
//  });
builder.Services.Configure(options =>
{
if (options == null)
{
throw new ArgumentNullException(nameof(options));
}

options.AreaPageViewLocationFormats.Clear();
options.AreaViewLocationFormats.Clear();
options.PageViewLocationFormats.Clear();
options.ViewLocationExpanders.Clear();
options.ViewLocationFormats.Clear();

var rootDirectory = "Pages";
var defaultPageSearchPath = CombinePath(rootDirectory, "{1}/{0}" + RazorViewEngine.ViewExtension);
options.PageViewLocationFormats.Add(defaultPageSearchPath);

// /Pages/Shared/{0}.cshtml
var pagesSharedDirectory = CombinePath(rootDirectory, "Shared/{0}" + RazorViewEngine.ViewExtension);
options.PageViewLocationFormats.Add(pagesSharedDirectory);

options.PageViewLocationFormats.Add("/Views/Shared/{0}" + RazorViewEngine.ViewExtension);

var areaDirectory = CombinePath("/RandomFolder/", "{2}");
// Areas/{2}/Pages/
var areaPagesDirectory = CombinePath(areaDirectory, "/Pages/");

// Areas/{2}/Pages/{1}/{0}.cshtml
// Areas/{2}/Pages/Shared/{0}.cshtml
// Areas/{2}/Views/Shared/{0}.cshtml
// Pages/Shared/{0}.cshtml
// Views/Shared/{0}.cshtml
var areaSearchPath = CombinePath(areaPagesDirectory, "{1}/{0}" + RazorViewEngine.ViewExtension);
options.AreaPageViewLocationFormats.Add(areaSearchPath);

var areaPagesSharedSearchPath = CombinePath(areaPagesDirectory, "Shared/{0}" + RazorViewEngine.ViewExtension);
options.AreaPageViewLocationFormats.Add(areaPagesSharedSearchPath);

var areaViewsSharedSearchPath = CombinePath(areaDirectory, "Views/Shared/{0}" + RazorViewEngine.ViewExtension);
options.AreaPageViewLocationFormats.Add(areaViewsSharedSearchPath);

options.AreaPageViewLocationFormats.Add(pagesSharedDirectory);
options.AreaPageViewLocationFormats.Add("/Views/Shared/{0}" + RazorViewEngine.ViewExtension);

options.ViewLocationFormats.Add(pagesSharedDirectory);
options.AreaViewLocationFormats.Add(pagesSharedDirectory);

options.ViewLocationExpanders.Add(new PageViewLocationExpander());
});

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}

app.MapGet("/debug/routes", (IEnumerable endpointSources) =>
string.Join("\n", endpointSources.SelectMany(source => source.Endpoints)));

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();
Вот моя структура папок:
Изображение

Я пытался просто добавить новый путь к папке в AreaPageViewLocationFormats, но это не сработало для страниц Razor (это работает для представлений контроллера, через AreaViewLocationFormats). Поэтому я попробовал это с помощью кода метода Настройка RazorViewEngineOptions из платформы.
Если я переименую папку во что-то другое и оставлю имя папки таким, как оно есть в Program.cs, произойдет ошибка, сообщающая, что программа искала страницу в следующих местах. Но как только переименуешь папку на то же имя, что и в Program.cs, выдаст 404. Это работает только если имя папки "Области". Это даже не работает для "Области".
Я что-то упустил?

Подробнее здесь: https://stackoverflow.com/questions/725 ... -structure
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»