0

我有一个自定义的 IHttpHandler,我用来在 MVC3 中调用我的控制器。问题是当我调用 View("~/path/to/my/view.cshtml") 时,我什么也得不到。没有错误。没什么,只是空源和200 ok。

既然我称这是我的自我,那么视图生命周期的某些部分是否还没有开始?

IHttpHandler:

public class MyHttpHandler : IHttpHandler
{
    ISimpleController _c;

    public SimpleHttpHandler(Controller c)
    {
        _c = c;
    }

    public bool IsReusable
    {
        get { return false; }
    }

    public void ProcessRequest(HttpContext context)
    {
        _c.Get();
    }

来自控制器的代码:

    public new ActionResult Get()
    {
        ViewBag.Proof = "Ping";
        ViewBag.Of = "Pong";
        ViewBag.Life = "Fizz";
        return View("~/Views/Shared/WhatAView.cshtml");
    }

WhatAView.cshtml:

<ul>
@foreach(var pair in ViewData)
{
   <li>@pair.Key : @pair.Value</li>
}
</ul>
4

1 回答 1

0

您唯一需要的是在您的 ActionResult 上调用 ExecuteResult()。这将强制渲染您的视图。这就是 MVC 框架在从控制器检索 ActionResult 后所做的事情。

_c.Get().ExecuteResult(_c.ControllerContext);

使用有效的 ControllerContext 正确实现控制器很重要。我已经使用 dotPeek 反编译了 ViewResultBase.ExecuteResult():

public override void ExecuteResult(ControllerContext context)
{
  if (context == null)
    throw new ArgumentNullException("context");
  if (string.IsNullOrEmpty(this.ViewName))
    this.ViewName = context.RouteData.GetRequiredString("action");
  ViewEngineResult viewEngineResult = (ViewEngineResult) null;
  if (this.View == null)
  {
    viewEngineResult = this.FindView(context);
    this.View = viewEngineResult.View;
  }
  TextWriter output = context.HttpContext.Response.Output;
  this.View.Render(new ViewContext(context, this.View, this.ViewData, this.TempData, output), output);
  if (viewEngineResult == null)
    return;
  viewEngineResult.ViewEngine.ReleaseView(context, this.View);
}

您会看到此方法将视图呈现为 ControllerContext.HttpContext。确保 HttpContext 在您的控制器中可用。

如上所示,您仍然可以使用原始渲染:

  TextWriter output = context.HttpContext.Response.Output;
  var viewResult = (ViewResult)_c.Get();
  viewResult.View.Render(new ViewContext(_c.ControllerContext, viewResult.View, viewResult.ViewData, viewResult.TempData, output), output);
于 2012-07-24T10:55:45.640 回答