微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

asp.net-mvc – 在ASP.NET MVC中创建控件外的ViewResult

我的几个控制器操作有一组标准的故障处理行为.一般来说,我想:

>根据路径数据加载对象(ID等)

>如果路径数据不指向有效的对象(例如:通过URL黑客攻击),则通知用户该问题并返回HTTP 404未找到

>验证当前用户对该对象具有适当的权限

>如果用户没有权限,请通知用户问题并返回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的最佳方法是什么?

解决方法

只要阅读这篇文章,因为我从一个动作过滤器出现同样的问题.我的解决方案是明确地创建视图操作.这是基于受MVC源的受保护的View()方法,因此它应该填充所需的属性.无论如何,似乎工作没有问题.
public static NotFound(Controller controller){
    controller.HttpContext.Response.StatusCode = 404;

    ViewResult result = new ViewResult {
            ViewName = "NotFound",ViewData = controller.ViewData,TempData = controller.TempData
        };
    return result;
}

有一天晚了,但这对我有用.

原文地址:https://www.jb51.cc/aspnet/246556.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐