【问题标题】:Null Values for Optional Parameters ASP.NET Web API可选参数的空值 ASP.NET Web API
【发布时间】:2018-12-17 12:03:25
【问题描述】:

我有一个 Web API 和一个非常快速的页面,我拼凑在一起测试它(调用 API 的实际页面是/将由外部供应商编写)。

我的搜索操作有几个参数,所有这些都是可选的,应该默认为空字符串。

[ActionName("Search")]
public IEnumerable<Foo> Get(string param1 = "", string param2 = "", string param3 = "")

以及调用 API 的 View:

@using (Ajax.BeginForm(new AjaxOptions { 
                       Url = ViewBag.APIUrl + "api/controller/Search",
                       HttpMethod = "GET",
                       OnSuccess = "successful" }))
{
    @Html.TextBox("param1")
    @Html.TextBox("param2")
    @Html.TextBox("param3")
}

GET 请求如下所示

[...]/Search?param1=&param2=&param3=

表单上的每个空值都作为 null 传递给 API 控制器,因此不使用空字符串的默认值。 (它确实按预期传递了实际值。)事实上,我在事后将它们合并为空字符串,但这个 API 的旧版本不必这样做。

当我添加时

int skip = 0, int take = 0

作为参数,我得到了

参数字典包含一个空条目

异常。我知道这可以通过使这些参数为空,然后像字符串一样将它们合并为空来解决。但就目的而言,它们不应该是可空的,它们应该是可选的,具有默认值。

如何让它使用动作中参数的默认值?我是在表单中还是在 API 控制器中做错了什么?

【问题讨论】:

    标签: asp.net-web-api2 asp.net-ajax optional-parameters


    【解决方案1】:

    如果您更改 API 控制器,则可以使用可选参数。示例请参考以下代码sn-p(假设使用Attribute Routing):

        [RoutePrefix("api/TestWebApi")]
        public class TestWebApiController : ApiController
        {
            [HttpGet]
            [Route("GetFoo")]
            public IQueryable<Foo> GetFoo(string param1 = "", string param2 = "", string param3 = "")
            {
                 // your implementation
            }
        }
    

    使用上面的控制器,可以实现以下四个测试用例:

    测试用例 1:通过所有三个参数

    api/TestWebApi/GetFoo?param1=a&param2=b&param3=c
    

    测试用例 2:通过 param2 和 param3

    /api/TestWebApi/GetFoo?param2=b&param3=c
    

    测试用例 3:通过 param3

    /api/TestWebApi/GetFoo?param3=c
    

    测试用例 4:使用默认值:

    /api/TestWebApi/GetFoo
    

    希望这会有所帮助。

    【讨论】:

    • 澄清一下:您建议更改的是将 [RoutePrefix("api/TestWebApi")] 和 [Route("GetFoo")] 分别添加到 Controller 和 Action?还是我还缺少其他东西?因为属性不起作用,我得到了和以前一样的行为。
    • 请确保您已按照“启用属性路由”here 部分中的说明正确配置属性路由。
    • WebApiConfig.Registerconfig.MapHttpAttributeRoutes();GlobalConfiguration.Configure(WebApiConfig.Register);Application_Start 中是正确的
    • 很抱歉,如果没有看到您的配置详细信息,我无法提供更多帮助。请查看this question,希望对您有所帮助。
    • 我在该问题中看不到任何与我的问题相关的内容。尽管我们没有在项目的任何其他 API 控制器中使用属性路由,但似乎配置正确。
    猜你喜欢
    • 2012-04-04
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-30
    • 2014-01-28
    • 2016-11-09
    • 1970-01-01
    相关资源
    最近更新 更多