2012-07-24 56 views
0

我有一个自定义的IHttpHandler,即时通讯使用在MVC3中调用我的控制器。问题是,当我调用View(“〜/ path/to/my/view.cshtml”)时,我什么都没有。没有错误。没什么,只是空的来源和200好。使用IHttpHandler从控制器调用的视图什么都不返回

由于即时调用这个我的自我有没有开始的视图生命周期的一部分?

的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> 

回答

0

你需要的唯一的事情就是在你的ActionResult调用的ExecuteReuslt()。这将强制渲染你的视图。这是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); 
+0

所以我应该叫ViewContext在MyHttpHandler.ProcessRequest?然后我仍然在Controller中调用View()。我认为View()的结果然后在ActionResult中,并且可以被ViewContext() – QueueHammer 2012-07-24 17:26:48

+0

@QueueHammer使用我发现我最初提出的实现已经存在于ViewResult.ExecuteResult()中。请阅读我更新的答案。顺便说一句,你说得对,需要使用ActionResult,ViewContext构造函数的3d参数应该是(ViewResult)ActionResult.ViewData。 – 2012-07-24 22:50:30

相关问题