ASP.NET MVC将Razor Partial View渲染为字符串错误?

时间:2012-06-21 21:14:00

标签: string view razor

我正在使用此代码尝试将剃刀部分视图呈现为字符串,以便发送电子邮件。

    public static string RenderPartialToString(
        string userControlPath,
        object viewModel,
        ControllerContext controllerContext,
        TempDataDictionary tempData)
    {
        using (var writer = new StringWriter())
        {
            var viewDataDictionary = new ViewDataDictionary(viewModel);
            var view = new WebFormView(controllerContext, userControlPath);
            var viewContext = new ViewContext(
                controllerContext,
                view,
                viewDataDictionary,
                tempData,
                writer
                );

            viewContext.View.Render(viewContext, writer);

            return writer.GetStringBuilder().ToString();
        }

    }

问题是我收到了以下错误:

must derive from ViewPage, ViewPage<TModel>, ViewUserControl, or ViewUserControl<TModel>. Stack Trace:  at  System.Web.Mvc.WebFormView.RenderView(ViewContext viewContext, TextWriter writer, Object instance) at .... RenderPartialToString

我该如何解决?

1 个答案:

答案 0 :(得分:2)

确实,WebFormView不会继承上述类,仅IView。我做了一些谷歌研究并得到了一个原型工作。 This page是最有帮助的。

我创建了一个空的MVC3应用程序并创建了以下HomeController。当我运行应用程序时,页面显示渲染的字符串。 resultAsString变量显示如何将呈现捕获为字符串。

using System;
using System.IO;
using System.Web.Mvc;

public class HomeController : Controller
{
    public ActionResult Index()
    {
        var result = RenderPartial(this.ControllerContext, "This is @DateTime.Now right now");
        var resultAsString = result.Content;
        return result;          
    }

    private ContentResult RenderPartial(ControllerContext controllerContext, string template)
    {
        var temporaryViewPath = string.Format("~/Views/{0}.cshtml", Guid.NewGuid());
        using (var stringWriter = new StringWriter())
        {
            using (var fileStream = System.IO.File.Create(Server.MapPath(temporaryViewPath)))
            {
                using (var streamWriter = new StreamWriter(fileStream))
                {                       
                    streamWriter.WriteLine(template);
                    streamWriter.Close();
                }
                fileStream.Close();
            }
            var razor = new RazorView(controllerContext, temporaryViewPath, null, false, null);
            razor.Render(new ViewContext(controllerContext, razor, new ViewDataDictionary(), new TempDataDictionary(), stringWriter), stringWriter);
            System.IO.File.Delete(Server.MapPath(temporaryViewPath));
            return Content(stringWriter.ToString());
        }
    }
}