c# - 如何使用来自常规 Web 表单的 MVC 操作结果(伪造的 ControllerContext)?

标签 c# asp.net asp.net-mvc viewengine actionresult

我们有一个可插入的框架,它返回将内容呈现给浏览器的 ActionResult 对象。一项最新的要求是我们的插件应该可以从常规 ASP.NET Web 窗体应用程序调用。

到目前为止,我已经想到了这个,它适用于非常基本的 ActionResults:

public class ActionResultTranslator {

    HttpContextBase _context;

    public ActionResultTranslator(HttpContextBase context ) {

        _context = context;
    }

    public void Execute(ActionResult actionResult) {

        ControllerContext fakeContext = new ControllerContext();
        fakeContext.HttpContext = _context;            

        actionResult.ExecuteResult(fakeContext);        
    }
}

您可以通过以下方式从 Web 表单调用上述内容:

protected void Page_Load(object sender, EventArgs e) {
   HttpContextWrapper contextWrapper = new HttpContextWrapper(this.Context);
   var translator = new ActionResultTranslator(contextWrapper);
   translator.Execute(new RedirectResult("http://google.com"));     
}

我还需要做些什么来连接所有东西?例如,如果我想返回一个 ViewResult 怎么办?

最佳答案

在 ControllerContext 上没有太多可以伪造的属性。

  • HttpContext - 您已经了解了这一点
  • Controller - 据我所知,没有标准的 ActionResults 关心它是否为 null
  • RequestContext - 如果为空,将自动填充
  • RouteData - 如果留空,将填充一个空集合。

所以您只需要担心 ActionResult 可能依赖于 RouteData 中存在的任意键。只要您填充actioncontroller ViewResult 就应该很高兴,这样它就知道在哪里寻找 View 文件。如果您更改代码以提供具有这些值的 RouteData,您应该没问题。

关于c# - 如何使用来自常规 Web 表单的 MVC 操作结果(伪造的 ControllerContext)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1613088/

相关文章:

asp.net-mvc - ASP.NET MVC - 如何处理过期的密码?

c# - 停止覆盖矩形接收 wpf 点击事件

c# - 用于 C# 开发的 Visual Studio 插件

c# - #DEBUG ASPX 页面中的预处理器语句

c# - .NET 垃圾收集行为(使用 DataTable 对象)

c# - 为什么Session变量会更新?

c# - 在 ASP.NET 中执行命令行实用程序

c# - 哪个效率更高??使用是对象和/或 try catch

asp.net-mvc - 如何通过 jQuery ajax 更新 ASP.NET MVC ViewData?

javascript - Ajax 脚本无法在表单提交上运行?