2014-01-07 2 views
3

Попытка использования примера на http://weblog.west-wind.com/posts/2012/May/30/Rendering-ASPNET-MVC-Views-to-String для передачи VIEW в виде строки и отправки в виде электронной почты. Который должен отправить счет-фактуру продажи по электронной почте пользователю.Пропустить VIEW как STRING

Iv'e добавил класс ViewRenderer к моему проекту. Затем добавили функцию ContactSeller в мой контроллер, и скопировал и переименовал вид счета-фактуры в качестве ViewOrderThroughEmail.cshtml

[HttpPost] 
    [AlwaysAccessible] 
    public ActionResult SendEmailAttachment(QBCustomerRecord cust) 
    { 
     ContactSellerViewModel model = new ContactSellerViewModel(); 
     string invoiceEmailAsString = ContactSeller(model); 
     _userService.SendEmail(username, nonce => Url.MakeAbsolute(Url.Action("LostPassword", "Account", new { Area = "Orchard.Users", nonce = nonce }), siteUrl), invoiceEmailAsString); 

     _orchardServices.Notifier.Information(T("The user will receive a confirmation link through email.")); 

     return RedirectToAction("LogOn"); 
    } 

    [HttpPost] 
    public string ContactSeller(ContactSellerViewModel model) 
    { 
     string message = ViewRenderer.RenderView("~/Orchard.Web/Modules/RainBow/Views/Account/ViewOrderThroughEmail.cshtml",model, 
                ControllerContext);  
     model.EntryId = 101; 
     model.EntryTitle = message; 


     return message; 
    } 

, но это вызывает ошибку, VIEW косяк быть NULL:

using (var sw = new StringWriter()) 
    { 
     var ctx = new ViewContext(Context, view, 
            Context.Controller.ViewData, 
            Context.Controller.TempData, 
            sw); 
     view.Render(ctx, sw); 
     result = sw.ToString(); 
    } 

в RenderViewToStringInternal функции в ViewRenderer .cs. Я мысленно думал, что это путь взгляда, но его нет.

Любые идеи? Благодаря

ответ

2

Я использую следующий метод расширения в моих проектах:

public static string RenderView(this Controller controller, string viewName, ViewDataDictionary viewData) 
{ 
    var controllerContext = controller.ControllerContext; 

    var viewResult = ViewEngines.Engines.FindView(controllerContext, viewName, null); 

    StringWriter stringWriter; 

    using (stringWriter = new StringWriter()) 
    { 
     var viewContext = new ViewContext(
      controllerContext, 
      viewResult.View, 
      viewData, 
      controllerContext.Controller.TempData, 
      stringWriter); 

     viewResult.View.Render(viewContext, stringWriter); 
     viewResult.ViewEngine.ReleaseView(controllerContext, viewResult.View); 
    } 

    return stringWriter.ToString(); 
} 

public static string RenderView(this Controller controller, string viewName, object model) 
{ 
    return RenderView(controller, viewName, new ViewDataDictionary(model)); 
} 

Тогда в вашем методе действия:

var viewString = this.RenderView("ViewName", model); 
Смежные вопросы