Некоторые из моих действий контроллера имеют стандартный набор поведения при обработке сбоев. В общем, я хочу:
- Load an object based on the Route Data (IDs and the like)
- If the Route Data does not point to a valid object (ex: through URL hacking) then inform the user of the problem and return an HTTP 404 Not Found
- Validate that the current user has the proper permissions on the object
- If the user doesn't have permission, inform the user of the problem and return an HTTP 403 Forbidden
- Если вышеприведенное выполнено успешно, то сделайте что-нибудь с этим объектом, зависящим от действия (например, визуализируйте его в представлении).
Эти шаги настолько стандартизированы, что я хочу иметь многоразовый код для реализации поведения.
Мой текущий план атаки состоял в том, чтобы иметь вспомогательный метод, чтобы сделать что-то вроде этого:
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;
}
Проблема здесь в том, что Controller.View() является защищенным методом и поэтому недоступен из помощника. Я рассматривал создание нового экземпляра ViewResult явно, но есть достаточно свойств, которые нужно установить, и я опасаюсь делать это, не зная сначала о подводных камнях.
Каков наилучший способ создать ViewResult вне определенного контроллера?