C# 如何使用常规web表单的MVC操作结果(伪造ControllerContext)?

C# 如何使用常规web表单的MVC操作结果(伪造ControllerContext)?,c#,asp.net,asp.net-mvc,viewengine,actionresult,C#,Asp.net,Asp.net Mvc,Viewengine,Actionresult,我们有一个可插入的框架,它返回ActionResult对象,这些对象向浏览器呈现内容。一个最新的要求是,我们的插件应该可以从常规的ASP.NET Web表单应用程序中调用 到目前为止,我已经提出了一个非常基本的行动结果: public class ActionResultTranslator { HttpContextBase _context; public ActionResultTranslator(HttpContextBase context ) {

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

到目前为止,我已经提出了一个非常基本的行动结果:

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-您已经了解了这一点
  • 控制器-据我所知,如果将其保留为空,则任何标准的ActionResults都不会在意
  • RequestContext-如果保留为空,将自动填充
  • RoutedData-如果保留空值,将使用空集合填充

因此,您只需担心ActionResult可能依赖于RouteData中存在的任意键。只要您填充操作控制器,以便它知道在哪里查找视图文件,ViewResult就会很满意。如果您修改代码以提供具有这些值的RoutedData,您应该可以。

如果我没有提供“操作”和“控制器”,该怎么办?如果我的插件返回ViewResult,我是否可以模拟MVC管道,以便找到视图并渲染结果,从而将其流式传输到浏览器?或者我可以在我的Web窗体项目中添加一个“虚拟”控制器类和一个视图文件夹吗?
controller
action
值只是告诉视图引擎在哪里查找的字符串,因此它们不必引用真正的控制器类或操作方法。实际上,它们只是要渲染的.aspx的文件夹和文件名,只要项目中有
/Views/controller/action.aspx
文件,就可以了。