【发布时间】:2023-03-31 10:10:01
【问题描述】:
我的几个控制器操作都有一套标准的故障处理行为。一般来说,我想:
- 根据路由数据(ID 等)加载对象
- 如果路由数据未指向有效对象(例如:通过 URL 黑客攻击),则通知用户该问题并返回 HTTP 404 Not Found
- 验证当前用户对对象具有适当的权限
- 如果用户没有权限,通知用户问题并返回 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 的最佳方法是什么?
【问题讨论】: