2016-03-16 97 views
0

在WebAPI項目中,我有以下控制器;檢查具有這些值的產品是否已經激化

public async Task<IHttpActionResult> PostProduct(Product product) 
    { 
     if (!ModelState.IsValid) 
     { 
      return BadRequest(ModelState); 
     } 

     db.Products.Add(product); 
     await db.SaveChangesAsync(); 

     return Ok(product); 
    } 

基於此模型

public class Product 
{ 
    public int Id { get; set; } 
public int ExternalId { get; set } 
    public string Title { get; set; } 
    [DatabaseGenerated(DatabaseGeneratedOption.Computed)] 
    public DateTime Created { get; set; } 
    public string Description { get; set; } 
public int ProductTypeId { get; set; } 
    public virtual ProductType IncidentType { get; set; } 

    public virtual ICollection<Manufacture> Manufactures { get; set; } 
} 

在我的控制,我希望做一個檢查,這樣可以節省產品,即檢查該外部ID togethr與ProductTypeId已經不excist之前。 含義,應該只有一個產品,其ExternalId爲123 togethr且ProductTypeId爲23.

如何將此檢查添加到我的控制器上面?

+0

您可以使用遠程驗證程序。這裏是一個角度/網絡api的例子:https://code.msdn.microsoft.com/AngularJS-with-Web-API-8210527d –

+0

@SteveGreene thx。但是當我讀到這個例子時,他們依靠一個前端來實際進行檢查(在他們的例子中標題excist),如果是true,則發佈到api。在我的情況下,我沒有這個選項,因爲這個api是面向用戶開放的,所以他們可以從他們自己的應用直接發佈到它。因此我無法在前端進行驗證檢查,因爲我沒有前端。 – brother

回答

1
public async Task<IHttpActionResult> PostProduct(Product product) 
{ 
    if (!ModelState.IsValid) 
    { 
     return BadRequest(ModelState); 
    } 

    if(db.Products.Any(x => x.ExternalId == product.ExternalId && x.ProductTypeId == product.ProductTypeId)) 
    { 
     return Conflict(); 
    } 

    db.Products.Add(product); 
    await db.SaveChangesAsync(); 

    return Ok(product); 
} 

雖然我不會推薦你的控制器中有這種邏輯。

+0

你還有什麼地方可以在面向公衆的API中使用這種邏輯? – brother

+0

我會將邏輯移動到控制器可以使用的其他類。也許用https://github.com/jbogard/MediatR實現'IRequestHandler'。這樣,控制器的唯一工作就是驗證模型狀態並返回正確的httpstatus代碼。 – peco