2012-02-09 8 views
6

Digamos que tengo un controlador que proporciona funciones de búsqueda para un estudiante:compartir puntos de vista entre los controladores sin necesidad de utilizar la carpeta compartida

public class StudentSearchController 
{ 
    [HttpGet] 
    public ActionResult Search(StudentSearchResultModel model) 
    { 
     return View(model); 
    } 
} 

Así que siempre que se proporcione la acción Buscar un StudentSearchResultModel, va a proporcionar una lista de Resultados de la búsqueda.

¿Hay alguna manera de extender eficazmente este método de acción desde otro controlador? Por ejemplo, digamos que quiere tener otros controladores que deben buscar los estudiantes, así: (. Presumiendo ambos modelos se extienden StudentSearchResultModel)

public class UniStudentController 
{ 
    [HttpPost] 
    public ActionResult Search(UniStudentSearchResultModel model) 
    { 
     return RedirectToAction("Search", "StudentSearch", model); 
    } 
} 

public class HighSchoolStudentController 
{ 
    [HttpPost] 
    public ActionResult Search(HighSchoolSearchResultModel model) 
    { 
     return RedirectToAction("Search", "StudentSearch", model); 
    } 
} 

Obviamente no puedo hacer esto, porque yo no puede pasar las clases de modelo previamente instanciadas al controlador de búsqueda (el controlador de búsqueda original recreará un StudentSearchResultModel, en lugar de utilizar el modelo que se aprobó).

La mejor solución que he encontrado hasta ahora es mover SearchView.cshtml a la carpeta "Compartida", luego puedo renderizar la vista desde los controladores Uni/HighSchool directamente (en lugar de llamar a "RedirectToAction") . Eso funciona bien, y en teoría no necesitaría StudentSearchController. Sin embargo, estoy construyendo sobre el código heredado aquí (en este ejemplo artificial, StudentSearchController es heredado), así que sin hacer una carga de refactorización, la carpeta "Compartida" no es una opción para mí.

Otra solución sería poner todas las acciones relacionadas con la búsqueda en el StudentSearchController, de modo que obtendría dos acciones para UniStudentSearch y HighSchoolStudentSearch. Aunque no me gusta este enfoque, ya que significa que el StudentSearchController necesita saber acerca de todos los de sus usos previstos.

¿Alguna idea?

PD: ¡No se opone a la refactorización, pero estoy limitado por los plazos!

Respuesta

5

se puede poner la ruta de la vista en su llamada a Ver()

return View("~/Views/StudentSearch/SearchView.cshtml", model); 
+0

True; pero SearchView tiene dependencias con otras vistas (por ejemplo, @ Html.Partial ("Controles/Estudiante")) que no se pueden encontrar si se toma este enfoque. – gerrod

+0

teniendo en cuenta que desea que SearchView sea compartido por varios controladores de esa manera, también debería ser más preciso con esas llamadas dentro de la vista. @ Html.Partial ("~/Controles/Estudiante") –

Cuestiones relacionadas