【问题标题】:ODataActionParameters to have a property with default valueODataActionParameters 具有具有默认值的属性
【发布时间】:2021-10-13 18:35:54
【问题描述】:

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

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

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

错误“:{ "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));
}

【问题讨论】:

  • 现有调用的url是什么?
  • 主机\控制器\GetSearchData。正文包含 json
  • 为什么不通过创建继承的新类型向 ODataActionParameters 添加可选参数
  • 现在尝试并收到此错误。 "error":{ "code":"","message":"该资源不支持请求实体的媒体类型 'application/json'。","innererror":{ "message":"没有可用的 MediaTypeFormatter从媒体类型为“application/json”的内容中读取“ODataActionParametersOptional”类型的对象。"}

标签: c# odata webapi


【解决方案1】:

你需要在路由中添加一个带问号的参数。

请参考documentation中的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 返回相同的资源。

【讨论】:

  • 不适用于 oDataController
猜你喜欢
  • 1970-01-01
  • 2013-10-17
  • 1970-01-01
  • 1970-01-01
  • 2013-02-14
  • 1970-01-01
  • 1970-01-01
  • 2012-01-08
  • 1970-01-01
相关资源
最近更新 更多