2012-09-03 8 views
9

¿Es posible que un método de controlador maneje todos los elementos publicados que se derivan de una clase base particular? La idea es poder enviar Comandos publicándolos en un punto final. Cuando intento lo siguiente, el parámetro "cmd" en el método de publicación siempre es nulo.ASP.New Web API - ¿Encuadernación y herencia de modelos?

Ejemplo

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

Una vez más, cuando intento este enfoque, el método Post se llama, pero el parámetro siempre es nula desde el marco. Sin embargo, si lo reemplazo con un método de publicación con un tipo de parámetro CommandA específico, funciona.

¿Es lo que estoy intentando posible? ¿O cada tipo de mensaje necesita un método de controlador separado en el controlador?

Respuesta

Cuestiones relacionadas