Передайте ВИД как СТРОКУ

Попытка использовать пример на 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);
Другие вопросы по тегам