2016-08-19 2 views
1

Учитывая нижнее пользовательское действие OData. Возможно ли получить более подходящую привязку рефакторинга параметров действия?Сильно типизированы параметры ODataActionParameters?

Обе магические строки должны быть точно такими же: .Parameter<int>("Rating") и (int)parameters["Rating"]. Которая в какой-то момент в будущем будет ломаться.

Config

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} 

Я попытался положить Парам eter непосредственно в методе. Но я не мог заставить его работать.

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, но у меня есть только примитивный тип в качестве параметра.

Пожалуйста совет :)

ответ

1

Я думаю, вы говорите об этой проблеме https://github.com/OData/WebApi/issues/777

В ODataActionParameters сделать вещь усложнять, когда есть только один параметр действия, мы будем стараться иметь обходной путь или дизайн для этого после того, как взлом версии 6.0.

+1

Это похоже на связь. Думаю, мне придется ждать этого обновления. –