2016-09-05 6 views
1

ViewResultを返す一連のアクションメソッドを持つASP.NET MVCコントローラがあります。パラメータが存在しない場合、それは ASP.NET MVC - OnActionExecutedのビュー結果を変更する

  • もしあるとしてだけViewResultを返し、

    • :今、私は次のように特定のURLパラメータに基づいて、アクションの結果を変更することができるようにする必要がありますパラメータが存在している、ちょうど実行されたアクションからViewResultを取る文字列にビューをレンダリングし、この文字列(生HTML)+(質問のない関連する)いくつかの追加の情報を含むFileStreamResultを返す

    I私のコントローラでOnActionExecutedを無効にすることでこれを試みました:

    protected override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
        base.OnActionExecuted(filterContext); 
        var viewResult = filterContext.Result as ViewResult; 
        if (viewResult != null /* && certain URL param present*/) 
        { 
         string rawHtml = RenderViewIntoString(viewResult); 
         filterContext.Result = new FileStreamResult(new MemoryStream(Encoding.UTF8.GetBytes(rawHtml)), "application/octet-stream"); 
        } 
    } 
    

    しかし、いくつかの理由viewResult.Viewはこちらnullあるので、私は、RenderViewIntoStringを実装する方法を見つけることができません。

    ビューを文字列にレンダリングするにはどうすればよいですか?

  • +0

    ? –

    +0

    @ JordyvanEijk、私は同じロジックを実装する必要がある私のコントローラ内に多くのアクションを持っているので。私は1つの方法ですべてそれを持っていたい。 –

    +0

    [このような質問](http://stackoverflow.com/questions/553936/in-mvc-how-do-i-return-a-string-result)を見てください –

    答えて

    1

    viewResult.Viewは、コントローラのコンテキストでビュー結果が実行された場合にのみ塗り潰されます(ExecuteResultメソッドはMVC source codeを参照)。メソッドOnActionExecutedがパイプラインの早期に呼び出されるため、viewResult.Viewnullになります。あなたがする必要がどのような

    手動ViewEngineCollectionを使用してビューを見つけ、それをレンダリングしている:

    private static string RenderViewIntoString(ViewResult viewResult, ActionExecutedContext filterContext) 
    { 
        string viewName = !string.IsNullOrEmpty(viewResult.ViewName) ? viewResult.ViewName : filterContext.ActionDescriptor.ActionName; 
    
        IView view = viewResult.ViewEngineCollection.FindView(filterContext.Controller.ControllerContext, viewName, viewResult.MasterName).View; 
    
        if (view == null) 
        { 
         throw new InvalidOperationException($"The view '{viewName}' or its master was not found"); 
        } 
    
        using (var stringWriter = new StringWriter()) 
        { 
         var viewContext = new ViewContext(filterContext.Controller.ControllerContext, view, filterContext.Controller.ViewData, filterContext.Controller.TempData, stringWriter); 
         view.Render(viewContext, stringWriter); 
         return stringWriter.ToString(); 
        } 
    } 
    
    あなたは自分のActionResultから文字列を返さない理由
    関連する問題