Маршрут с бесконечным путем в действии ASP.NET Core - PullRequest
0 голосов
/ 24 апреля 2019

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

Примерно так:

https://github.com/{orgName}/{projectName}/blob/{branchName}/{folderName1}/{folderName2}/.../{folderNameN}/{fileName}

Для примера

https://github.com/AiursoftWeb/Nexus/blob/master/Account/Controllers/AccountController.cs

Будет маршрутизироватьсяна это действие.И результат маршрута должен быть:

orgName: AiursoftWeb
projectName: Nexus
branchName: master
folderNames: string[2] of:
    "Account"
    "Controllers"
fileName: AccountController.cs

Как мне этого добиться?

Я пробовал следующий способ:

[Route("Folders/ViewContent/{siteName}/{folderNames}")]
public async Task<IActionResult> ViewContent(string siteName, params string[] folderNames)
{
    throw new NotImplementedException();
}

Но это не работает.

Ответы [ 2 ]

3 голосов
/ 24 апреля 2019

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

[Route("Folders/ViewContent/{siteName}/{*folderNames}")]
public async Task<IActionResult> ViewContent(string siteName, string folderNames)
{
    folderNames = folderNames ?? "";
    string[] folders = folderNames.Split('/', StringSplitOptions.RemoveEmptyEntries);

     // your other code
}

Начиная с ASP.net Core 2.2, вы должны использовать двойную звездочку, чтобы сгенерированные автоматически URL-адреса не избежали косой черты в URL:

[Route("Folders/ViewContent/{siteName}/{**folderNames}")]

С https://docs.microsoft.com/en-us/aspnet/core/fundamentals/routing?view=aspnetcore-2.2

Вы можете использовать звездочку (*) или двойную звездочку (**) в качестве префикса к параметр маршрута для привязки к остальной части URI. Это называется универсальные параметры. Например, blog/{**slug} соответствует любому URI, который начинается с /blog и имеет любое значение после него, которое присваивается slug значение маршрута. Параметры Catch-all также могут соответствовать пустым строка.

Параметр catch-all экранирует соответствующие символы, когда Маршрут используется для генерации URL, включая разделитель пути (/) персонажи. Например, маршрут foo/{*path} со значениями маршрута { path = "my/path" } генерирует foo/my%2Fpath. Обратите внимание на побег вперед слэш. Чтобы использовать символы разделителя пути туда и обратно, используйте маршрут ** префикс параметра. Трасса foo/{**path} с { path = "my/path" } генерирует foo/my/path.

0 голосов
/ 24 апреля 2019

Вы используете 2 ограничения в маршрутизации, которые приводят к точному совпадению с URL. Вы уверены, что ваш URL начинается с "Папки / ViewContent /". У вас есть 6 папок в вашем URL в соответствии с вашим вопросом, но ваша маршрутизация обрабатывает только 4 папки, которые deeeper. Напишите маршрутизацию, соответствующую этой папке, передав большее имя папки (или заполнитель для папки).

Для лучшей отладки вы можете передать весь URL как статический и изменить один за другим для лучшей отладки вашей маршрутизации.

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