2

このコードを使用して、電子メールを送信する目的で、かみそりの部分ビューを文字列としてレンダリングしようとしています。

    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

どうすれば修正できますか?

4

1 に答える 1

2

確かに、言​​及WebFormViewされたクラスから継承していませんIView。Google で少し調べたところ、プロトタイプが機能しました。このページが一番役に立ちました。

空の 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());
        }
    }
}
于 2012-06-21T21:16:50.383 に答える