En mi aplicación ASP.NET MVC, tengo una interfaz que actúa como plantilla para varios modelos de vista diferentes:Pasando una interfaz a un método de acción ASP.NET MVC controlador
public interface IMyViewModel
{
Client Client1 { get; set; }
Client Client2 { get; set; }
Validator Validate();
}
Por lo tanto, mi opinión modelos se definen así:
public interface MyViewModel1 : IMyViewModel
{
Client Client1 { get; set; }
Client Client2 { get; set; }
// Properties specific to MyViewModel1 here
public Validator Validate()
{
// Do ViewModel-specific validation here
}
}
public interface MyViewModel2 : IMyViewModel
{
Client Client1 { get; set; }
Client Client2 { get; set; }
// Properties specific to MyViewModel2 here
public Validator Validate()
{
// Do ViewModel-specific validation here
}
}
Entonces Actualmente tengo una acción de controlador separado para hacer la validación para cada tipo diferente, usando enlace de modelos:
[HttpPost]
public ActionResult MyViewModel1Validator(MyViewModel1 model)
{
var validator = model.Validate();
var output = from Error e in validator.Errors
select new { Field = e.FieldName, Message = e.Message };
return Json(output);
}
[HttpPost]
public ActionResult MyViewModel2Validator(MyViewModel2 model)
{
var validator = model.Validate();
var output = from Error e in validator.Errors
select new { Field = e.FieldName, Message = e.Message };
return Json(output);
}
Esto funciona bien, pero si tuviera 30 tipos de modelos de vista diferentes, entonces tendría que haber 30 acciones de controlador separadas, todas con código idéntico además de la firma del método, lo que parece una mala práctica.
Mi pregunta es, ¿cómo puedo consolidar estas acciones de validación para poder pasar cualquier tipo de modelo de vista y llamar a su método Validate(), sin importar de qué tipo se trata?
Al principio trató de usar la interfaz como el parámetro de acción:
public ActionResult MyViewModelValidator(IMyViewModel model)...
Pero esto no funcionó: recibo una excepción Cannot create an instance of an interface
. Pensé que una instancia del modelo pasaría a la acción del controlador, pero aparentemente este no es el caso.
Estoy seguro de que me falta algo simple. O quizás acabo de abordar todo esto mal. ¿Puede alguien ayudarme?
Al final opté por este enfoque simplemente por limitaciones de tiempo, pero también me explicaste por qué el objeto ya no es una instancia cuando se pasa al controlador, lo que es útil saber. –