Допустим, у меня есть приложение ASP. NET Core 3.0 MVC, которое имеет простой контроллер, содержащий два действия и использующий маршрутизацию на основе атрибутов:
[Route("home")]
public class HomeController : Controller
{
public static string ControllerName { get; } = "Home";
public HomeController()
{
}
string GenerateUrls()
{
string url1 = Url.Action(nameof(Action1), ControllerName);
string url2 = Url.Action(nameof(Action2Async), ControllerName);
return $"Action1: '{url1}'\nAction2: '{url2}'";
}
[HttpGet("a1")]
public IActionResult Action1()
{
return Ok(GenerateUrls());
}
[HttpGet("a2")]
public async Task<IActionResult> Action2Async()
{
await Task.CompletedTask;
return Ok(GenerateUrls());
}
}
Поэтому вызов любого действия должен просто выдайте страницу с URL-адресами для обоих действий.
Открытие /home/a1
и /home/a2
правильно вызывает соответствующие действия, но вывод выглядит неожиданно:
Action1: '/home/a1'
Action2: ''
Это означает, что Url.Action()
возвратил пустую строку для второго действия, хотя она отлично работала для первого действия.
После долгой отладки я обнаружил сообщение в блоге , отслеживающее это Самая проблема заключается в критическом изменении в ASP. NET Core 3.0, где суффикс Async
каким-то образом игнорируется Url.Action()
.
Автор исправил эту проблему путем жесткого кодирования строк в качестве имен действий ("Action1"
и "Action2"
в моем случае). Он также загрузил пример кода , воспроизводящий это поведение.
Однако я бы действительно предпочел сохранить nameof
, чтобы избежать последующих проблем с переименованием / рефакторингом.
Есть ли чистый способ использования nameof
или других безопасных типов конструкций для предоставления метода с суффиксом Async
для функции Url.Action
?