2012-06-21 2 views
2

Я использую этот код, чтобы попытаться отобразить частичный вид бритвы в виде строки для отправки электронной почты.ASP.NET MVC рендеринг Razor Partial View as String Error?

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 

Как исправить?

ответ

2

Действительно, WebFormView не наследует от указанных классов, только IView. Я сделал небольшое исследование Google и получил прототип работы. 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()); 
     } 
    } 
} 
+0

Вы могли бы указать код? что именно я должен его определить? – Andy

+0

Я опубликовал код из рабочего прототипа. Подпись метода отличается, но вы должны иметь возможность адаптировать ее к вашим потребностям. – neontapir

Смежные вопросы