Передайте ВИД как СТРОКУ
Попытка использовать пример на http://weblog.west-wind.com/posts/2012/May/30/Rendering-ASPNET-MVC-Views-to-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. Я думал, что это путь зрения, но это не так.
Есть идеи? Спасибо
1 ответ
Я использую следующий метод расширения в моих проектах:
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);