2012-09-03 12 views
9

Kann eine Controller-Methode alle Posted-Elemente verarbeiten, die von einer bestimmten Basisklasse stammen? Die Idee besteht darin, Befehle zu versenden, indem sie an einen Endpunkt gesendet werden. Wenn ich Folgendes versuche, ist der Parameter "cmd" in der Post-Methode immer Null.ASP.New Web API - Modellbindung und Vererbung?

Beispiel

//the model: 
public abstract class Command{ 
    public int CommandId{get; set;} 
} 
public class CommandA:Command{ 
    public string StringParam{get; set;} 
} 
public class CommandB:Command{ 
    public DateTime DateParam{get; set;} 
} 

//and in the controller: 
    public HttpResponseMessage Post([FromBody]Command cmd) 
    { 
     //cmd parameter is always null when I Post a CommandA or CommandB 
     //it works if I have separate Post methods for each Command type 
     if (ModelState.IsValid) 
     { 
      if (cmd is CommandA) 
      { 
       var cmdA = (CommandA)cmd; 
       // do whatever 
      } 
      if (cmd is CommandB) 
      { 
       var cmdB = (CommandB)cmd; 
       //do whatever 
      } 

      //placeholder return stuff 
      var response = Request.CreateResponse(HttpStatusCode.Created); 
      var relativePath = "/api/ToDo/" + cmd.TestId.ToString(); 
      response.Headers.Location = new Uri(Request.RequestUri, relativePath); 
      return response; 
     } 
     throw new HttpResponseException(HttpStatusCode.BadRequest); 
    } 

Auch wenn ich versuche, diesen Ansatz der Post-Methode aufgerufen wird, aber der Parameter ist vom Rahmen immer null. Wenn ich es jedoch durch eine Post-Methode mit einem bestimmten CommandA-Parametertyp ersetze, funktioniert es.

Was versuche ich? Oder benötigt jeder Nachrichtentyp eine separate Handler-Methode im Controller?

Antwort