È 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?