2012-09-03 21 views
9

È possibile che un metodo Controller gestisca tutti gli elementi inviati che derivano da una particolare classe base? L'idea è di essere in grado di inviare i comandi pubblicandoli su un endpoint. Quando provo quanto segue, il parametro "cmd" nel metodo Post è sempre nullo.ASP.New API Web: modello Binding ed Ereditarietà?

Esempio

//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); 
    } 

Anche in questo caso, quando provo questo approccio il metodo POST viene chiamato, ma il parametro è sempre nullo dal quadro. Tuttavia, se lo sostituisco con un metodo Post con un tipo di parametro CommandA specifico, funziona.

È quello che sto tentando possibile? O ogni tipo di messaggio richiede un metodo di gestione separato nel controller?

risposta