Некоторые из моих действий с контроллером имеют стандартный набор правил обработки отказов. В общем, я хочу:
- Загрузка объекта на основе данных маршрута (идентификаторов и т.п.)
- Если данные маршрута не указывают на действительный объект (например, через хакерство URL), сообщите об этом пользователю и верните HTTP 404 Not Found
- Подтвердите, что текущий пользователь имеет соответствующие разрешения для объекта
- Если пользователь не имеет разрешения, сообщите об этом пользователю и верните запрещенный протокол HTTP 403
- Если вышеописанное выполнено успешно, то сделайте что-нибудь с этим объектом, специфичным для конкретного действия (т.е. сделайте его в представлении).
Эти шаги настолько стандартизированы, что я хочу иметь многоразовый код для реализации поведения.
Мой текущий план атаки заключался в том, чтобы иметь вспомогательный метод, чтобы сделать что-то вроде этого:
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 извне определенного контроллера?