有没有办法在控制器中获取PartialView HTML内容?

use*_*365 3 asp.net-mvc asp.net-mvc-3

我有一个带有outputCache的控制器的局部视图,因为我需要缓存这个元素.

然后我需要在每个页面中渲染这个PartialView,但首先我需要做一些字符串替换.

所以我的问题是,如何在控制器中获得部分视图,以便我可以操作内容并在将其返回到View之前进行一些字符串替换?

谢谢

bev*_*qua 8

我在自定义Controller基础上使用这些方法.

    public string RenderPartialToString(string partialViewName, object model)
    {
        InvalidateControllerContext();
        IView view = ViewEngines.Engines.FindPartialView(ControllerContext, partialViewName).View;
        string result = RenderViewToString(view, model);
        return result;
    }

    public string RenderViewToString(string viewName, object model)
    {
        InvalidateControllerContext();
        IView view = ViewEngines.Engines.FindView(ControllerContext, viewName, null).View;
        string result = RenderViewToString(view, model);
        return result;
    }

    public string RenderViewToString(IView view, object model)
    {
        InvalidateControllerContext();
        string result = null;
        if (view != null)
        {
            StringBuilder sb = new StringBuilder();
            using (StringWriter writer = new StringWriter(sb))
            {
                ViewContext viewContext = new ViewContext(ControllerContext, view, new ViewDataDictionary(model), new TempDataDictionary(), writer);
                view.Render(viewContext, writer);
                writer.Flush();
            }
            result = sb.ToString();
        }
        return result;
    }

    private void InvalidateControllerContext()
    {
        if (ControllerContext == null)
        {
            ControllerContext context = new ControllerContext(System.Web.HttpContext.Current.Request.RequestContext, this);
            ControllerContext = context;
        }
    }
Run Code Online (Sandbox Code Playgroud)

InvalidateControllerContext方法适用于您需要Controller手动实例以在控制器上下文之外呈现部分或视图的场景.