Kilka moich działań kontrolera ma standardowy zestaw zachowania związanego z niepowodzeniem. Ogólnie rzecz biorąc, chcę:Tworzenie właściwości ViewResults poza kontrolerami w ASP.NET MVC
- obciążenia obiekt na podstawie danych trasy (IDS i podobne)
- Jeśli dane trasy nie wskazuje ważnego obiektu (np: poprzez URL hacking) następnie poinformować użytkownika o problemie i powrotu HTTP 404 Not Found
- potwierdzić, że bieżący użytkownik ma odpowiednie uprawnienia do obiektu
- Jeśli użytkownik nie ma uprawnień, Poinformuj użytkownika o problemie i zwróć komunikat HTTP 403 Forbidden
- Jeśli powyższe powiodło się, zrób coś z tym obiektem, który jest specyficzny dla akcji (np. renderuj go w widoku).
Kroki te są tak wystandaryzowane, że chcę mieć kod wielokrotnego użytku, aby zastosować to zachowanie.
Mój obecny plan ataku było posiadanie metody pomocnika do zrobienia czegoś takiego:
public static ActionResult HandleMyObject(this Controller controller,
Func<MyObject,ActionResult> onSuccess) {
var myObject = MyObject.LoadFrom(controller.RouteData).
if (myObject == null) return NotFound(controller);
if (myObject.IsNotAllowed(controller.User)) return NotAllowed(controller);
return onSuccess(myObject);
}
# NotAllowed() is pretty much the same as this
public static NotFound(Controller controller){
controller.HttpContext.Response.StatusCode = 404
# NotFound.aspx is a shared view.
ViewResult result = controller.View("NotFound");
return result;
}
Problem polega na tym, że Controller.View() jest chroniony sposób i tak nie jest dostępne od pomocnika . Spojrzałem na tworzenie nowej instancji ViewResult jawnie, ale jest wystarczająco dużo właściwości, aby ustawić, że jestem ostrożny o tym, bez uprzedniego poznania pułapek.
Jaki jest najlepszy sposób utworzenia widoku ViewResult spoza określonego kontrolera?
+1: Tak bym to zrobił. –
Nie podoba mi się to, że kontroler może mieć tylko jeden zestaw wspólnych działań: to, co on (pojedynczo) dziedziczy. W tym konkretnym przypadku nie jest to problemem, ale widzę, że staje się on coraz bardziej nieporęczny w miarę rozwoju projektu. –
Rozumiem, że twoje pytanie ma lata, ale pomyślałem, że wspomnę o innej możliwości. Możesz udostępnić publiczną wersję 'View()' nazwaną 'GetView()' na twoim podstawowym kontrolerze, wtedy możesz trzymać swojego pomocnika w oddzielnej klasie. Nadal będziesz musiał przekazać kontroler do swojego pomocnika, co jest nieco niezręczne, ale pozwala na kompozycję zamiast dziedziczenia. – devuxer