19 votos

En asp.net mvc es posible hacer un controlador genérico?

Estoy intentando crear un controlador genérico, es decir:

public class MyController<T> : Controller where T : SomeType
{ ... }

Sin embargo, cuando trato de usarlo, me estoy quedando en este error por todas partes...

El nombre del controlador debe terminar en 'Controller'

Por lo tanto, mi pregunta, Es posible hacer un controlador genérico en asp.net mvc?

Gracias!

29voto

Jeff Fritz Puntos 5002

Si lo entiendo correctamente, lo que usted está tratando de hacer, es la ruta de todas las solicitudes para un Modelo determinado a través de un controlador genérico de tipo T.

Te gustaría que el T a variar según el Modelo solicitado.

Quisiera /Product/Index a desencadenar MyController<Product>.Index()

Esto puede lograrse mediante la escritura de sus propios IControllerFactory y la aplicación de la CreateController método como este:

	public IController CreateController(RequestContext requestContext, string controllerName)
	{
	    Type controllerType = Type.GetType("MyController").MakeGenericType(Type.GetType(controllerName));
	    return Activator.CreateInstance(controllerType) as IController;
	}

7voto

Iain Holder Puntos 7930

Sí se puede, que está bien y lo he usado mucho a mí mismo.

Lo que usted necesita para tener en cuenta es que cuando se hereda de MyController todavía puede terminar el nombre del tipo con el controlador:

public class FooController :  MyController<Foo>
{ 
 ...
}

1voto

Martin Peck Puntos 8078

El controlador por defecto de fábrica utiliza la "convención" alrededor de los nombres de controlador cuando se está tratando de encontrar un controlador para el envío de la solicitud. Usted podría reemplazar esta funcionalidad de búsqueda de si quería, que podría permitir a su controlador genérico para trabajar.

Este artículo de MSDN...

http://msdn.microsoft.com/en-us/magazine/dd695917.aspx

... tiene una buena valoración crítica de lo que está pasando.

1voto

DaveMorganTexas Puntos 376

Este es un duplicado de asp.net mvc controlador genérico que en realidad contiene la respuesta correcta. Jeff Fritz la respuesta es absolutamente no es correcto. La creación de su propia IControllerFactory no va a conseguir más allá de la limitación en ExpressionHelper.GetRouteValuesFromExpression que está generando el error que usted está viendo. La implementación de su propio IControllerFactory se puede con los errores de siempre que llame RedirectToAction, BuildUrlFromExpression, ActionLink, RenderAction, BeginForm, cualquiera de los métodos que llamar a los.

Lo que es interesante para mí, es que Microsoft es la "restricción por convención" ya está forzada por restricción "donde TController : Controlador" que se coloca sobre el tipo en el ExpressionHelper.GetRouteValuesFromExpression método. No hay un genérico nunca satisfacer la convención de validación:

string controllerName = typeof(TController).Name;
if (!controllerName.EndsWith("Controller", StringComparison.OrdinalIgnoreCase)) {
    throw new ArgumentException(MvcResources.ExpressionHelper_TargetMustEndInController, "action");
}

a menos que se hereda de una clase que terminan en "Controlador" porque typeof(AnyGeneric).Nombre nunca se acabará con el "Controlador".

0voto

cottsak Puntos 5490

Si yo fuera usted, me gustaría obtener el MVC fuente y crear una prueba de proyecto de MVC con el código fuente de modo que usted puede examinar en donde la excepción se genera y ver qué se puede hacer acerca de su idea genérica y la ejecutada "*controlador" convención de nomenclatura.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by: