首页 > 解决方案 > ODataActionParameters 具有具有默认值的属性

问题描述

我有一个场景是我需要向现有的 oData 控制器操作添加一个可选参数。这样现有的呼叫就不会中断,新的呼叫可以选择性地添加它。我试过以下

  1. 将 ODataActionParameters 中的值读取为可为空var optionalParam = parameters["optionalParam"] as Boolean?;
  2. 将其添加为附加参数(尝试为空)并提供默认值GetSearchdata([FromBody]ODataActionParameters parameters, bool optionalParam = false)
  3. 使用附加参数并将其标记为来自 UriGetSearchdata([FromBody]ODataActionParameters parameters, [FromUri] bool? optionalParam = false)

但是如果参数没有在正文中传递,所有这些都会给我错误。这样做的正确方法是什么?

error":{ "code":"","message":"请求无效。","innererror":{ "message":"parameters : 请求中缺少“GetSearchdata”操作的一个或多个参数有效载荷。缺少的参数是: optionalParam。\r\n","type":"","stacktrace":"" } }

现有功能如下

[HttpPost]
[EnableQuery(MaxExpansionDepth = 100)]
public AdvancedSearchdata GetSearchdata([FromBody]ODataActionParameters parameters)
{
    var moduleIdsObject = parameters["moduleIds"] as IEnumerable<int>;
    return (service.GetSearchdata(moduleIdsObject.ToList(), false));
}

标签: c#odatawebapi

解决方案


您需要在路由中添加带问号的参数。

请参考文档中的 belo 示例。

public class BooksController : ApiController
{
    [Route("api/books/locale/{lcid:int?}")]
    public IEnumerable<Book> GetBooksByLocale(int lcid = 1033) { ... }
}

在此示例中,/api/books/locale/1033 和 /api/books/locale 返回相同的资源。


推荐阅读