String ASP.NET MVC将部分视图渲染为字符串错误?
为了发送电子邮件,我正在使用此代码尝试将razor部分视图呈现为字符串String ASP.NET MVC将部分视图渲染为字符串错误?,string,view,razor,String,View,Razor,为了发送电子邮件,我正在使用此代码尝试将razor部分视图呈现为字符串 public static string RenderPartialToString( string userControlPath, object viewModel, ControllerContext controllerContext, TempDataDictionary tempData) { using (var w
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
必须派生自ViewPage、ViewPage、ViewUserControl或ViewUserControl。堆栈跟踪:位于。。。。渲染投影
我该如何解决这个问题呢?事实上,
WebFormView
并不是从上述类继承的,只是IView
。我在谷歌做了一点调查,得到了一个原型。他是最有帮助的
我创建了一个空的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());
}
}
}
您能指定一些代码吗?我应该将它定义为什么?我发布了一个工作原型的代码。方法签名是不同的,但是您应该能够根据需要调整它。