2016-08-16 3 views
0

Ich habe einen API-Controller, der Aktionen zum Abrufen und Bereitstellen von Daten hat. und ich versuche GetProductById meyhod von ajax bu productId Parameter ist immer gleich Null (0). Wenn ich GetAll-Methode mit GET-Methode aufrufen möchte, ist alles in Ordnung. JavaScript-Code ist wie untenASP.NET Core API-Parameter ist null

var product = JSON.stringify({ productId: id }); 
     $http({ 
      method: 'POST', 
      contentType: 'application/json', 
      url: '/api/Product/ProductInfo', 
      data: product 
     }).then(function successCallback(response) { 
      console.log(response); 
     }, function errorCallback(response) { 
      console.log(response); 
     }); 

und API-Controller ist wie unten

[Route("api/Product")] 
public class ProductController : BaseController 
{ 
    [HttpPost] 
    [Route("ProductInfo")] 
    public Product GetProductById([FromBody]int productId) 
    { 
     return UnitOfWork.GetRepository<Product>().FirstOrDefault(i => i.Id == productId); 
    } 
    [HttpGet] 
    [Route("GetAll")] 
    public string GetAll() 
    { 
     return "Can"; 
    } 
} 

Kann mir jemand sagen, warum dieser Fall geschieht?

Antwort

1

Obwohl Sie eine Zeichenfolgendarstellung von { productId: id } zurücksenden, wenn das Modell in der Post-Methode im Controller verknüpft ist, erwartet es eine int. productId ist kaum das Argument dieser Methode, es definiert nicht den Parameternamen, den Sie senden sollen. Versuchen Sie, nur die ID im Körper anstelle dieses JSON-Körpers { productId: id } zu senden.

Wenn Sie einen json Körper zurück zu senden, dann sollte die richtige Darstellung eine Klasse wie die für Ihre Post Maßnahme im Anschluss an sein

class ProductModel 
{ 
    int productId; 
} 

Dies würde Sie in der Lage im Wesentlichen machen Ihre json Nutzlast so, wie Sie senden zu analysieren Jetzt können Sie sich natürlich für benutzerdefinierte Modellbinder entscheiden, aber das wäre ein Overkill.

Zum Beispiel, wenn die ID 123 nur als Körper verwenden 123, nicht { productId: 123 }

+0

I-Code geändert. Weder sollte ich url wie path? ProductId = 1 aufrufen, noch sollte ich Referenztypen anstelle primitiver Typen verwenden –

+0

Cool. Das ist im Wesentlichen der richtige Weg zu gehen, da es ein Post ist. :) Obwohl Sie in diesen Fällen ein Schlüsselwertpaar verwenden können, sind keine zusätzlichen Klassen erforderlich. –

+0

KeyValuePair? wie kann ich es von json senden oder ist es klar, von api aktion zu bekommen? –