从MVC 4视图获取html到字符串

Gia*_*los 19 c#-4.0 asp.net-mvc-4

我试图使用这个问题的接受答案.

它似乎正是我正在寻找的,但我有一个问题.我不知道怎么称呼它.这是我到目前为止:

首先,我从我提到的解决方案中复制代码:

public string ToHtml(string viewToRender, ViewDataDictionary viewData, ControllerContext controllerContext)
{
    var result = ViewEngines.Engines.FindView(controllerContext, viewToRender, null);

    StringWriter output;
    using (output = new StringWriter())
    {
        var viewContext = new ViewContext(controllerContext, result.View, viewData, controllerContext.Controller.TempData, output);
        result.View.Render(viewContext, output);
        result.ViewEngine.ReleaseView(controllerContext, result.View);
    }

    return output.ToString();
}
Run Code Online (Sandbox Code Playgroud)

这就是我所拥有的:

string viewToRender = "...";
int Data1 = ...;
int Data2 = ...;

System.Web.Mvc.ViewDataDictionary viewData = new System.Web.Mvc.ViewDataDictionary();
viewData.Add("Data1",Data1);
viewData.Add("Data2",Data2);

string html = ToHtml(viewToRender, viewData, ?????)//Here is my problem.
Run Code Online (Sandbox Code Playgroud)

我应该在controllerContext参数中传递什么?

dav*_*v_i 38

而不是继承Controller哪些意味着你必须记住每次都要记住它,或者从a继承CustomControllerBase,这意味着你必须记住每次都继承 - 简单地做一个扩展方法:

public static class ControllerExtensions
{
    public static string RenderView(this Controller controller, string viewName, object model)
    {
        return RenderView(controller, viewName, new ViewDataDictionary(model));
    }

    public static string RenderView(this Controller controller, string viewName, ViewDataDictionary viewData)
    {
        var controllerContext = controller.ControllerContext;

        var viewResult = ViewEngines.Engines.FindView(controllerContext, viewName, null);

        StringWriter stringWriter;

        using (stringWriter = new StringWriter())
        {
            var viewContext = new ViewContext(
                controllerContext,
                viewResult.View,
                viewData,
                controllerContext.Controller.TempData,
                stringWriter);

            viewResult.View.Render(viewContext, stringWriter);
            viewResult.ViewEngine.ReleaseView(controllerContext, viewResult.View);
        }

        return stringWriter.ToString();
    }
}
Run Code Online (Sandbox Code Playgroud)

然后Controller你可以这样打电话:

this.RenderView("ViewName", model);
Run Code Online (Sandbox Code Playgroud)

  • 对于任何寻找局部视图的人来说,用FindPartialView替换FindView. (3认同)

ser*_*ene 10

您可以创建一个基本控制器,它显然扩展了控制器并在基本控制器中使用上述功能,而扩展此基本控制器的其他控制器将能够使用它.但是,ControllerContext必须用作

Request.RequestContext
Run Code Online (Sandbox Code Playgroud)

因此你的BaseController就像

public class BaseController: Controller
{
//your function here
}
Run Code Online (Sandbox Code Playgroud)

而你的ToHtml()函数将是

protected virtual string ToHtml(string viewToRender, ViewDataDictionary viewData )
{
   var controllerContext=Request.RequestContext;
   var result = ViewEngines.Engines.FindView(controllerContext, viewToRender, null);

   StringWriter output;
   using (output = new StringWriter())
   {
      var viewContext = new ViewContext(controllerContext, result.View, viewData, controllerContext.Controller.TempData, output);
      result.View.Render(viewContext, output);
      result.ViewEngine.ReleaseView(controllerContext, result.View);
   }

   return output.ToString();
}
Run Code Online (Sandbox Code Playgroud)

并使用基本控制器

public class MyController: BaseController
{
//ToHtml(...);
}
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

32405 次

最近记录:

8 年,6 月 前