2012-02-09 15 views
6

Powiedzmy Mam kontroler, który zapewnia funkcje wyszukiwania dla studenta:wymiany poglądów między kontrolerami bez korzystania z udostępnionego folderu

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

Dopóki Akcja Szukaj zapewniono StudentSearchResultModel, to odda listę wyniki wyszukiwania.

Czy istnieje sposób na skuteczne rozszerzenie tej metody działania z innego kontrolera? Na przykład, powiedzmy, że chcę mieć inne kontrolery, które muszą szukać dla studentów, na przykład: (. Zakładając, oba modele rozszerzają 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); 
    } 
} 

I oczywiście nie można tego zrobić, bo nie może przekazać wstępnie utworzonych klas modeli do kontrolera wyszukiwania (oryginalny kontroler wyszukiwania odtworzy obiekt StudentSearchResultModel, zamiast używać modelu, który został przekazany).

Najlepszym rozwiązaniem, jakie dotychczas wymyśliłem, jest przeniesienie SearchView.cshtml do folderu "Shared", a następnie mogę wyświetlić widok bezpośrednio z kontrolerów Uni/HighSchool (zamiast wywoływania "RedirectToAction") . To działa dobrze, a teoretycznie nie potrzebowałbym w ogóle ucznia. Jednakże buduję tutaj kod źródłowy (w tym wymyślonym przykładzie, StudentSearchController jest starszą wersją), więc bez robienia refaktoryzacji, folder "Shared" nie jest dla mnie opcją.

Innym rozwiązaniem byłoby umieszczenie wszystkich działań związanych z wyszukiwaniem w module StudentSearchController, aby uzyskać dwie akcje dla UniStudentSearch i HighSchoolStudentSearch. Nie podoba mi się to podejście, ponieważ oznacza to, że StudentSearchController musi wiedzieć o wszystkie swoich zamierzonych zastosowań.

Wszelkie pomysły?

PS: Nie sprzeciwia się refaktoryzacji, ale są ograniczone terminami!

Odpowiedz

5

można umieścić ścieżkę widoku w wywołaniu do widzenia()

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

true; ale SearchView ma zależności od innych widoków (np. @ Html.Partial ("Controls/Student")), których nie można znaleźć, jeśli podejmiesz takie podejście. – gerrod

+0

biorąc pod uwagę, że chcesz, aby SearchView był współdzielony przez wiele kontrolerów w ten sposób, musisz być bardziej precyzyjny z tymi połączeniami wewnątrz widoku. @ Html.Partial ("~/Controls/Student") –

Powiązane problemy