【问题标题】:MVC null route ID takes me to spa(angular) rather than returning a bad requestMVC 空路由 ID 将我带到 spa(angular) 而不是返回错误请求
【发布时间】:2020-07-02 22:25:27
【问题描述】:

我一直在寻找这个问题,但还没有找到答案。简而言之,我有一个使用 angular spa 模板的 .net 核心 Web 应用程序。我有多个充当 API 的控制器,通常一切正常。但是在以下情况下,我很好奇是否有另一种方法可以在不重载操作的情况下完成发送空 id。

这是我所拥有的并且按预期工作:

[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}");
}

目前,当我尝试这样做时,null id 路由将被视为不存在,并且该路由将被传递给 angular 来处理。重载是实现这一目标的首选和唯一方法吗?还是有别的办法?

【问题讨论】:

  • 有没有办法将路由参数指定为可选?

标签: c# asp.net-mvc .net-core routes spa-template


【解决方案1】:

找到了答案,而且很简单。只需要在动作方法中添加另一个属性。

[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}");
}

【讨论】:

    【解决方案2】:

    根据您在前端所做的工作,重要的是要记住字符串可以为空而不是 null。 此外,您将不得不删除不带参数的路线。考虑下面的代码:

    [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}");
    }
    

    【讨论】:

    • 不幸的是,问题不为空或为空。代码根本不会运行。 MVC 将缺少 ID 视为不同的路由,因此会寻找不同的路由。在我的第二个示例中,第二个路由不存在,因此它将路由传递给 Angular 路由器。这是我试图避免的问题。
    • @Drew 因此,我提到您必须删除不带参数的路线,并将此路线作为唯一路线。
    • 是的,只是重新阅读,但由于您没有从路线中删除 ID,因此被您的代码抛弃了。但是,即使这样做了,问题仍然存在。路线只是简单地传递给 angular 来处理。我找到了答案,我会回复的。
    猜你喜欢
    • 2013-01-09
    • 2021-09-21
    • 2022-06-30
    • 1970-01-01
    • 2014-01-14
    • 1970-01-01
    • 2019-10-25
    • 2019-12-24
    • 2013-03-14
    相关资源
    最近更新 更多