从类库中渲染ViewUserControl

时间:2010-09-16 17:28:13

标签: asp.net-mvc

我想渲染一些HTML以用于电子邮件。我有一组表示行和列的对象,所以我可以使用StringBuilder在纯C#代码中呈现HTML。

但是我更喜欢在类库中使用ViewUserControl或ViewView来进行渲染。我希望能够从ASP.NET MVC应用程序外部使用ViewUserControl和渲染方法强文本 d,例如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 个答案:

答案 0 :(得分:3)

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();
}

答案 1 :(得分:0)

您遇到的问题是使用asp.net引擎,这是默认视图引擎使用的。

您可以使用不同的视图引擎来避免它,例如spark。

另一个选择是使用类似于你的代码,但是启动一个asp.net appdomain /我会在几天内分享一些代码。