代码之家  ›  专栏  ›  技术社区  ›  MartinHN

从类库呈现ViewUserControl

  •  1
  • MartinHN  · 技术社区  · 14 年前

    但是我更喜欢在类库中有一个ViewUserControl或者仅仅一个ViewPage,这样可以进行渲染。我希望能够使用ViewUserControl和渲染方法 从一个ASP.NETMVC应用程序,例如Windows服务。

    如何从类库渲染视图?

    我尝试了这个,但是对RenderPartial的调用抛出了一个NullReferenceException。

    [TestMethod]
    public void RenderViewToString()
    {
    string viewName = "EmailTest";
    string viewData = "martin";
    
    //Create memory writer 
    var sb = new StringBuilder();
    var memWriter = new StringWriter(sb);
    
    //Create fake http context to render the view 
    var fakeResponse = new HttpResponse(memWriter);
    var fakeContext = new HttpContext(new HttpRequest("fake.html", "http://localhost/fake.html", ""), fakeResponse);
    var fakeRouteData = new RouteData();
    fakeRouteData.Values.Add("Controller", "Fake");
    var fakeControllerContext = new ControllerContext(new HttpContextWrapper(fakeContext), fakeRouteData, new FakeController());
    
    HttpContext.Current = fakeContext;
    
    //Use HtmlHelper to render partial view to fake context 
    var html = new HtmlHelper(new ViewContext(fakeControllerContext, new FakeView(), new ViewDataDictionary(), new TempDataDictionary(), memWriter), new ViewPage());
    
    html.RenderPartial(viewName, viewData);
    
    //Flush memory and return output 
    memWriter.Flush();
    
    var htmlString = sb.ToString();
    

    2 回复  |  直到 14 年前
        1
  •  0
  •   eglasius    14 年前

    您可以通过使用不同的视图引擎(如spark)来避免这种情况。

    另一个选择是使用类似于您的代码,但启动asp.netappdomain/我将在几天内共享一些这样做的代码。

        2
  •  3
  •   Darin Dimitrov    14 年前

    Try this :

    public static string RenderPartialToString(string controlName, object viewData)
    {
        ViewDataDictionary vd = new ViewDataDictionary(viewData);
        ViewPage vp = new ViewPage { ViewData = vd };
        Control control = vp.LoadControl(controlName);
    
        vp.Controls.Add(control);
    
        StringBuilder sb = new StringBuilder();
        using (StringWriter sw = new StringWriter(sb))
        {
            using (HtmlTextWriter tw = new HtmlTextWriter(sw))
            {
                vp.RenderControl(tw);
            }
        }
        return sb.ToString();
    }