Идентификатор нулевого маршрута MVC приводит меня в спа (угловой), а не возвращает неверный запрос

Я долго искал этот вопрос, но пока не нашел ответа. Вкратце, у меня есть базовое веб-приложение.net, использующее шаблон angular spa. У меня есть несколько контроллеров, которые действуют как API, и в целом все работает нормально. Однако в следующей ситуации мне любопытно, есть ли другой способ выполнить отправку нулевого идентификатора БЕЗ перегрузки действия.

Вот что у меня есть и работает как положено:

[HttpGet("[action]")]
public IActionResult SayHello()
{
    return BadRequest(new
    {
        error = "Name registered as null.",
        message = "No value(null) was provided to the api resource 'SayHello' which resulted in no action taken."
    });
}

[HttpGet("[action]/{name}")]
public IActionResult SayHello(string name)
{
    return Ok($"Hello {name}");
}

Я хочу знать, могу ли я сделать это БЕЗ перегрузки? Например, просто сделайте это:

[HttpGet("[action]/{name}")]
public IActionResult SayHello(string name)
{
    if (name == null)
    {
        return BadRequest(new
        {
            error = "Name registered as null.",
            message = "No value(null) was provided to the api resource 'SayHello' which resulted in no action taken."
        });
    }
    return Ok($"Hello {name}");
}

В настоящее время, когда я пытаюсь это сделать, маршрут с нулевым идентификатором будет рассматриваться, как будто он не существует, и маршрут будет передан в angular для обработки. Является ли перегрузка предпочтительным и единственным способом добиться этого? Или есть другой способ?

2 ответа

Решение

Нашел ответ, и это довольно просто. Просто нужно добавить еще один атрибут к методу действия.

[HttpGet("[action]")]
[HttpGet("[action]/{name}")]
public IActionResult SayHello(string name)
{
    if (name == null)
    {
        return BadRequest(new
        {
            error = "Name registered as null.",
            message = "No value(null) was provided to the api resource 'SayHello' which resulted in no action taken."
        });
    }
    return Ok($"Hello {name}");
}

В зависимости от того, что вы делаете во внешнем интерфейсе, важно помнить, что строка может быть пустой, а не нулевой. Кроме того, вам нужно будет удалить маршрут без параметра. Рассмотрим код ниже:

[HttpGet("[action]/{name}")]
public IActionResult SayHello(string name)
{
    if (string.IsNullOrEmpty(name))//this
    {
        return BadRequest(new
        {
            error = "Name registered as null.",
            message = "No value(null) was provided to the api resource 'SayHello' which resulted in no action taken."
        });
    }
    return Ok($"Hello {name}");
}
Другие вопросы по тегам