2012-02-09 2 views
6

Diciamo che ho un controller che fornisce funzioni di ricerca per uno studente:Condivisione di vedute tra i controller senza utilizzare la cartella condivisa

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

Fino a quando è previsto l'azione di ricerca di uno StudentSearchResultModel, renderà un elenco di risultati di ricerca.

C'è un modo per estendere efficacemente questo metodo di azione da un altro controller? Ad esempio, consente di dire voglio avere altri controller che hanno bisogno di cercare per gli studenti, in questo modo: (. Presumendo entrambi i modelli si estendono 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); 
    } 
} 

Io, ovviamente, non posso fare questo, perché io non può passare le classi del modello pre-istanziate al controller di ricerca (il controller di ricerca originale ricrea un modello StudentSearchResultModel, anziché utilizzare il modello che è stato passato).

La soluzione migliore che ho trovato finora è spostare SearchView.cshtml nella cartella "Shared", quindi posso semplicemente rendere la vista dai controller Uni/HighSchool direttamente (invece di chiamare "RedirectToAction") . Funziona bene, e in teoria non avrei affatto bisogno di StudentSearchController. Tuttavia, sto costruendo sul codice legacy qui (in questo esempio forzato, StudentSearchController è legacy), quindi senza fare un boatload di refactoring, la cartella "Shared" non è un'opzione per me.

Un'altra soluzione sarebbe quella di mettere tutte le azioni relative alla ricerca in StudentSearchController - in modo da ottenere due azioni per UniStudentSearch e HighSchoolStudentSearch. Non mi piace questo approccio, tuttavia, poiché significa che StudentSearchController deve conoscere tutti gli dei suoi usi previsti.

Qualche idea?

PS: non contraria al refactoring, ma sono limitato dalle scadenze!

risposta

5

si può mettere il percorso della vista nella chiamata a Visualizza()

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

Vero; ma SearchView ha dipendenze da altre viste (ad es. @ Html.Partial ("Controls/Student")) che non può essere trovato se si segue questo approccio. – gerrod

+0

considerando che si desidera che SearchView sia condiviso da più controller in questo modo, si dovrebbe essere più precisi anche con quelle chiamate all'interno della vista. @ Html.Partial ("~/Controlli/studente") –