2012-07-24 22 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

相關問題