强类型的 ODataActionParameters 可能吗?
Strongly typed ODataActionParameters possible?
鉴于以下 OData 自定义操作。是否可以对操作参数进行更重构友好的绑定?
两个魔术字符串必须完全相同:.Parameter<int>("Rating")
和 (int)parameters["Rating"]
。这肯定会在未来的某个时候崩溃。
配置
ODataModelBuilder builder = new ODataConventionModelBuilder();
builder.EntitySet<Product>("Products");
// New code:
builder.Namespace = "ProductService";
builder.EntityType<Product>()
.Action("Rate")
.Parameter<int>("Rating");
控制器
[HttpPost]
public async Task<IHttpActionResult> Rate([FromODataUri] int key, ODataActionParameters parameters)
{
if (!ModelState.IsValid)
{
return BadRequest();
}
int rating = (int)parameters["Rating"];
db.Ratings.Add(new ProductRating
{
ProductID = key,
Rating = rating
});
try
{
await db.SaveChangesAsync();
}
catch (DbUpdateException e)
{
if (!ProductExists(key))
{
return NotFound();
}
else
{
throw;
}
}
return StatusCode(HttpStatusCode.NoContent);
}
请求
POST http://localhost/Products(1)/ProductService.Rate HTTP/1.1
Content-Type: application/json
Content-Length: 12
{"Rating":5}
我尝试将参数直接放在方法中。但是我无法让它工作。
public async Task<IHttpActionResult> Rate([FromODataUri] int key, int rate)
根据 How to pass an objet as a parameter to an OData Action using ASP.NET Web Api? 看来可以使用 Object
但我只有原始类型作为参数。
请指教:)
我认为你在谈论这个问题https://github.com/OData/WebApi/issues/777
当只有一个操作参数时,ODataActionParameters 会使事情变得复杂,我们将在中断更改 6.0 版本后尝试为此设计一种解决方法或设计。
鉴于以下 OData 自定义操作。是否可以对操作参数进行更重构友好的绑定?
两个魔术字符串必须完全相同:.Parameter<int>("Rating")
和 (int)parameters["Rating"]
。这肯定会在未来的某个时候崩溃。
配置
ODataModelBuilder builder = new ODataConventionModelBuilder();
builder.EntitySet<Product>("Products");
// New code:
builder.Namespace = "ProductService";
builder.EntityType<Product>()
.Action("Rate")
.Parameter<int>("Rating");
控制器
[HttpPost]
public async Task<IHttpActionResult> Rate([FromODataUri] int key, ODataActionParameters parameters)
{
if (!ModelState.IsValid)
{
return BadRequest();
}
int rating = (int)parameters["Rating"];
db.Ratings.Add(new ProductRating
{
ProductID = key,
Rating = rating
});
try
{
await db.SaveChangesAsync();
}
catch (DbUpdateException e)
{
if (!ProductExists(key))
{
return NotFound();
}
else
{
throw;
}
}
return StatusCode(HttpStatusCode.NoContent);
}
请求
POST http://localhost/Products(1)/ProductService.Rate HTTP/1.1
Content-Type: application/json
Content-Length: 12
{"Rating":5}
我尝试将参数直接放在方法中。但是我无法让它工作。
public async Task<IHttpActionResult> Rate([FromODataUri] int key, int rate)
根据 How to pass an objet as a parameter to an OData Action using ASP.NET Web Api? 看来可以使用 Object
但我只有原始类型作为参数。
请指教:)
我认为你在谈论这个问题https://github.com/OData/WebApi/issues/777
当只有一个操作参数时,ODataActionParameters 会使事情变得复杂,我们将在中断更改 6.0 版本后尝试为此设计一种解决方法或设计。