2010-03-12 17 views
9

Yo estaba un poco sorprendido hace unos minutos cuando traté de sobrecargar una acción en una de mis controladoresacciones sobrecarga del controlador

tuve

public ActionResult Get() 
{ 
    return PartialView(/*return all things*/); 
} 

I añadido

public ActionResult Get(int id) 
{ 
    return PartialView(/*return 1 thing*/); 
} 

. ... y de repente ninguno estaba trabajando

Resolví el problema al hacer 'id' nulable y deshacerse de los otros dos métodos

public ActionResult Get(int? id) 
{ 
    if (id.HasValue) 
     return PartialView(/*return 1 thing*/); 
    else 
     return PartialView(/*return everything*/); 
} 

y funcionó, pero mi código se puso un poco feo!

¿Algún comentario o sugerencia? ¿Tengo que vivir con esta imperfección en mis controladores?

Gracias

de Dave

Respuesta

4

No se puede sobrecargar las acciones de esta manera como usted ha descubierto.

La única forma de tener varias acciones con el mismo nombre es si responden a verbos diferentes.

Argumentaría que tener un único método que maneje ambas situaciones es una solución más limpia que le permite encapsular su lógica en un solo lugar y no confiar en tener múltiples métodos con el mismo nombre que se usan para diferentes propósitos . - Por supuesto, esto es subjetivo y solo mi opinión.

Si realmente desea tener métodos separados, puede asignarles un nombre diferente para que indiquen claramente sus diferentes propósitos. e.g .:

public ActionResult GetAll() 
{ 
    return PartialView(/*return all things*/); 
} 

public ActionResult Get(int id) 
{ 
    return PartialView(/*return 1 thing*/); 
} 
+0

@Matt, buen punto. Debería haber sido GetAll(). – DaveDev

1

En mi opinión, realmente tiene sentido lo que dices Dave. Si, por ejemplo, tengo un seleccionar que tiene la opción de seleccionar todo, o un solo registro, no quiero diferentes métodos para eso, sino tener un método con una sobrecarga como el que Dave muestra en el ejemplo.

// MRW

0

no veo a respuestas correctas aquí, así que quiero para publicar una respuesta correcta.

Sí, puede sobrecargar los resultados de acción en MVC utilizando el atributo Nombre de acción.

[ActionName("Get")] 
public ActionResult Get() 
{ 
    return PartialView(/*return all things*/); 
} 

[ActionName("GetById")] 
public ActionResult Get(int? id) 
{ 
    //code 
} 
Cuestiones relacionadas