2016-07-12 12 views
1

Ich habe folgende API, die sich um die Aktualisierung Elemente in der Datenbank nimmt:MVC 6 API Mehrere Parameter

[Route("update")] 
    [HttpPost("")] 
    public JsonResult UpdateRecords([FromBody]ICollection<ShoppingItemViewModel> vm) 
    { 
     if (ModelState.IsValid) 
     { 
      try 
      { 
       var items = Mapper.Map<IEnumerable<ShoppingItem>>(vm); 

       //update database 
       _repository.UpdateValues(items, User.Identity.Name); 

       return Json(null); 
      } 
      catch (Exception Ex) 
      { 
       Response.StatusCode = (int)HttpStatusCode.BadRequest; 
       return Json(null); 
      } 
     } 
     else 
     { 
      Response.StatusCode = (int)HttpStatusCode.BadRequest; 
      return Json(null); 
     } 
    } 

Dann unter meinem Angular Code, den ich Ausführung dieses POST Methode wie folgt vor:

$scope.SaveChanges = function() { 
     $http.post("/api/items/update", $scope.items) 
      .then(function (response) { 
      }, function (err) { 
       $scope.errorMessage = "Error occured: " + err; 
      }).finally(function() { 

      }); 

    }; 

Was ich tun möchte, ist, neue Parameter zu meiner ursprünglichen UpdateRecords Funktion einzuführen, wo einige von ihnen optional sind. Dann würde mein Verfahren abhängig von den eingefügten Parametern verschiedene Dinge tun.

Was ich versucht habe zu tun ist, um meine Funktion zu ändern wie folgt (Beispiel):

public JsonResult UpdateRecords([FromBody]ICollection<ShoppingItemViewModel> vm, [FromBody]bool EraseOldItems) 

und unter meiner Angular App:

$http.post("/api/items/update", {vm:$scope.items, EraseOldItems: true}) 

oder sogar

$http.post("/api/items/update", {'vm':$scope.items, 'EraseOldItems': true}) 

aber ich konnte den Code nicht zum Funktionieren bringen (meine Parameter waren die ganze Zeit Null).

Was mache ich hier falsch?

Antwort

2

Von Parameter Binding in ASP.NET Web API:

Allenfalls einem Parameter erlaubt aus dem Nachrichtentext zu lesen.

// Caution: Will not work!  
public HttpResponseMessage Post([FromBody] int id, [FromBody] string name) { ... } 

Der Grund für diese Regel ist, dass der Antrag Körper in einem ungepufferten Strom gespeichert werden kann, die einmal werden können nur gelesen werden.

Sie können eine Anfrage Objekt übergeben, das andere Objekte enthält:

public class Request 
{ 
    public ICollection<ShoppingItemViewModel> vm { get; set; } 
    public bool eraseOldItems { get; set; } 
} 

Und dann Ihre Aktion:

[Route("update")] 
[HttpPost("")] 
public JsonResult UpdateRecords([FromBody]Request request){ ... }