2017-05-03 3 views
0

Ich versuche, ein Objekt von einem Angular Post auf eine ASP.Net MVC Core Web API Post-Methode zu buchen.Kann ich ein komplexes Objekt mit Eigenschaften, die selbst Objekte sind, an einen FromBody-Parameter in der Core Web API senden?

Die Winkelfunktion sieht wie folgt aus:

 $scope.addAction = function (pAction, pCaseId) { 
      pAction.caseId = pCaseId; 

      $http.post(actionUrl, pAction) 
       .then(function (response) { 
       $scope.data.actions.push(response.data); 
       }) 
       .catch(function (error) { 
       $scope.data.ActionInsertError = error; 
       }); 
     } 

Alles ist gebaut immer genau so, wie ich direkt vor dem POST wollen:

enter image description here

Hier ist die Net-Core-Web-API-POST :

[HttpPost] 
public async Task<Generic.Model.Lerd.Action> Post([FromBody]ActionFromBodyModel model) 
{ 
    long result; 
    Generic.Model.Lerd.Action action; 
    using (var conn = _context.Database.GetDbConnection()) 
    { 
     conn.Open(); 

     using (var command = conn.CreateCommand()) 
     { 
      StringBuilder sb = new StringBuilder(); 
      sb.Append("INSERT INTO Actions "); 
      sb.Append("(ActionStatus, ActionTypeId, CaseId, DateCreated, Notes) "); 
      sb.Append("VALUES "); 
      sb.Append("(@ActionStatus, @ActionTypeId, @CaseId, @DateCreated, @Notes); "); 
      sb.Append("SELECT CAST(scope_identity() AS int);"); 

      command.CommandText = sb.ToString(); 

      command.Parameters.Add(new SqlParameter("@ActionStatus", SqlDbType.Int) { Value = model.ActionStatus }); 
      command.Parameters.Add(new SqlParameter("@ActionTypeId", SqlDbType.BigInt) { Value = model.ActionTypeId }); 
      command.Parameters.Add(new SqlParameter("@CaseId", SqlDbType.BigInt) { Value = model.CaseId }); 
      command.Parameters.Add(new SqlParameter("@DateCreated", SqlDbType.DateTime) { Value = DateTime.Now }); 
      command.Parameters.Add(new SqlParameter("@Notes", SqlDbType.NVarChar) { Value = model.Notes }); 

      try 
      { 
       result = (int)command.ExecuteScalar(); 
       action = await _genericService.GetSingleIncludingAsync(result, 
        a => a.ActionType); 
      } 
      catch(Exception ex) 
      { 
       throw ex; 
      } 
     } 

    } 

    return action; 
} 

Hier ist das FromBody-Modell:

public class ActionFromBodyModel 
{ 
    public long CaseId { get; set; } 
    public long ActionTypeId { get; set; } 
    public long ActionStatus { get; set; } 
    public string Notes { get; set; } 
} 

Ich kann meine Top-Level-Eigenschaften hier:

enter image description here

Jetzt versuche ich, das ActionType1 Objekt aus PCase im Angular Beitrag zum Web-API-Pfosten zu erhalten.

So füge ich diese Eigenschaft in das FromBody Modell:

public class ActionFromBodyModel 
{ 
    public long CaseId { get; set; } 
    public long ActionTypeId { get; set; } 
    public long ActionStatus { get; set; } 
    public string Notes { get; set; } 

    public ActionType1 ActionType1 { get; set; } 
} 

ActionType1 wie folgt aussieht:

public class ActionType1 : BaseEntity 
{ 
    [ForeignKey("Id")] 
    public long ActionId { get; set; } 
    public virtual Action Action { get; set; } 

    public long ActionProposedBySupervisorId { get; set; } 
    [ForeignKey("ActionProposedBySupervisorId")] 
    public LookupDetail ActionProposedBySupervisor { get; set; } 

    public long ActionTakenBySupervisorId { get; set; } 
    [ForeignKey("ActionTakenBySupervisorId")] 
    public LookupDetail ActionTakenBySupervisor { get; set; } 

    public DateTime ActionEffectiveDate { get; set; } 
} 

Aber wenn ich diese Eigenschaft in hinzufügen, mein ganzes FromBody Objekt ist null auf der Post . Ich bekomme nicht einmal die Top-Level-Eigenschaften.

Gibt es eine Möglichkeit, komplexe Objekte wie diese zu posten?

Antwort

0

Es stellte sich heraus, dass meine Benennung vom Angular-Modell zum Backend-Modell deaktiviert war.

Ich habe gerade ID auf die meisten meiner Eigenschaften im Angular-Modell angeheftet, um das Backend-Modell für meine ng-Modell-Attribute im Formular zu finden.

Verwandte Themen