¿Es seguro asumir que un controlador solo usará un modelo primario?

7

Por lo tanto, estoy diseñando un marco MVC. En el nombre de mantener todo lo que está escrito de forma estática y no mágico, he encontrado un gran problema con el paso "automático" de modelos a un controlador.

Por lo tanto, tradicionalmente, generalmente no veo más de un modelo usado a la vez en un controlador en cuanto a llenado automático.

Por ejemplo, tome esto tutorial . Hay un método como este en el controlador:

[HttpPost]
public ActionResult Create(Movie newMovie)
{

    if (ModelState.IsValid)
    {
        db.AddToMovies(newMovie);
        db.SaveChanges();

        return RedirectToAction("Index");
    }
    else
    {
        return View(newMovie);
    }
}

Mi preocupación es pasar un modelo Movie al método Create que se llena con los valores de FORM "mágicamente". En mi API, esto debería ser fácilmente posible y se vería así en el enrutamiento:

var movie=router.Controller((context) => new MovieController(context))
                 .WithModel(() => new Movie());
movie.Handles("/movie/create").With((controller, model) => controller.Create(model));

Mi preocupación con esto es que es mucho más difícil tener múltiples modelos debido a las limitaciones con el sistema de tipo C #. Por supuesto, el controlador siempre puede crear manualmente los modelos a partir de valores FORM y similares, pero no es tan bonito.

Entonces, mi pregunta: ¿Es común tener algo como Foo(Movie model) y Bar(SomeClass model) en la misma clase de controlador? ¿Es una buena idea para mí intentar admitir un escenario de este tipo, o solo es un síntoma de poner demasiada lógica no relacionada en un solo controlador?

Nota: si te preocupa cómo es posible esta API fluida, la respuesta es delegados genéricos ... muchísimos delegados genéricos :) (pero hasta ahora muy poca reflexión)

    
pregunta Earlz 01.03.2013 - 05:33

3 respuestas

9

En resumen No. No creo que se pueda asumir que un controlador solo usará un modelo primario.

La mayoría de las aplicaciones MVC terminarán con muchos modelos diferentes que se utilizan en todas partes.

Utilizando el ejemplo de su Película, si solo necesita usar un par de elementos fuera de su modelo de Película, probablemente creará un modelo de vista más pequeño que se asignó desde el modelo de vista principal, ya que será más rápido y usará menos recursos.

Si está utilizando Entity Framework, esto puede lograrse fácilmente anulando la configuración de AutoMapper.

Espero que esto ayude un poco.

    
respondido por el Gaz Winter 01.03.2013 - 10:00
2

Esto no responde directamente a la pregunta en el título, pero puede darte algo para pensar.

El fragmento de código que tiene allí parece ser de MVC3. En MVC3 hay una distinción importante entre los modelos de dominio / base de datos / aplicación y los modelos de vista. Si bien el controlador puede usar muchos modelos de dominio para procesar solicitudes (compilar vistas, enviar cosas a la base de datos y todo eso), solo puede vincular un modelo de vista a una vista, y esa vista solo puede enviar un modelo de vista en post-back. Por lo tanto, el envío de múltiples modelos de dominio a la acción implicaría un modelo de vista intermedio que se vincularía a la vista y tendría referencias a los modelos de dominio.

En mi opinión, lo que la mayoría de los tutoriales más simples hacen mal es que usan el modelo de dominio como un modelo de vista, lo cual está bien por sí solo, pero creo que hay una distinción conceptual que debe tenerse en cuenta. .

Cuando trabaje con formas / vistas complejas en MVC3, lo más frecuente es que necesite modelos de vista separados que estarán compuestos de múltiples modelos de dominio, y / o que aplane parte del gráfico de objetos de dominio para facilitar las representaciones en La vista y manejo de los valores posteriores. Incluso entonces, algunos formularios más complejos hacen que recupere valores de publicaciones individuales, ya sea desde la solicitud en sí misma o estableciendo otro parámetro de acción con el nombre del campo de formulario esperado.

    
respondido por el Ivan Pintar 01.03.2013 - 10:59
0

En mi humilde opinión, primero creo que un controlador debería controlar una subsección de su proyecto, digamos el sistema de mensajería o, en su caso, el dominio de la película. Entonces, en esencia, no creo que esté mal usar los diferentes modelos requeridos para lograr su objetivo en un controlador. Además, puede usar su modelo de dominio sin subclasificar como lo hacen los desarrolladores de código de marco de entidad. Entonces, lo más importante es que usted planifique sus controladores de manera que todos los métodos de acción en ellos realicen un conjunto de funciones relacionadas.

    
respondido por el Cizaphil 04.03.2013 - 23:38

Lea otras preguntas en las etiquetas