ControllerContext и ViewData вне области действия контроллера - MVC3 C # - PullRequest
5 голосов
/ 05 февраля 2012

Я рендеринг PartialViews / Models с помощью метода ниже, чтобы шаблон электронной почты, которые будут отправлены.

Я использую приведенный ниже код для преобразования партиала и модели в html-строку, которую я могу передать в свой код отправки электронной почты.

public class BaseController : Controller
{
    public string RenderPartialViewToString(string viewName, object model)
    {
        if (string.IsNullOrEmpty(viewName))
            throw new ArgumentException("No View Path Provided.");

        ViewData.Model = model;

        using (StringWriter sw = new StringWriter())
        {
            ViewEngineResult viewResult = ViewEngines.Engines.FindPartialView(ControllerContext, viewName);
            ViewContext viewContext = new ViewContext(ControllerContext, viewResult.View, ViewData, TempData, sw);
            viewResult.View.Render(viewContext, sw);

            return sw.GetStringBuilder().ToString();
        }
    }
}

В настоящее время это живет в BaseController, я хотел бы переместить его в вспомогательный метод, чтобы я мог также перемещать построение / отправку модели электронной почты из контроллера.

Проблема в том, что у меня нет доступа к ViewData / TempData / ControllerContext

Я могу создать ControllerContext, но я не знаю, что делать с ViewData / TempData.

Вот как я бы использовал то, что у меня есть в контроллере:

//Do Stuff in Controller

var html = RenderPartialViewToString("~/Views/Mail/_ForgotPassword.cshtml", new MailModel { Username = "Skrillex", SomethingElse = "foo" });

//Send the Email

Ответы [ 3 ]

2 голосов
/ 05 февраля 2012

Я думаю, что вы на правильном пути, но проблема в том, что вы стремитесь завершить разделение, это скорее слишком нетерпеливо.

Вы используете движок представления Razor для рендеринга электронной почты в формате HTML. Очень благородный подход. Однако это означает, что вы будете очень близки к своему уровню представления и запускать его извне контроллера - на мой взгляд - не имеет большого смысла.

Я считаю, что вам нужно сделать (если еще не сделано):

  • Ваш адрес электронной почты Razor считается строго набранным
  • Пусть рендеринг вызывается в контроллере как обычно
  • Визуализация будет такой же простой, как передача модели в метод Render
  • Вынесите модель своей электронной почты желающему помощнику. Это не потребовало бы никакой логики уровня представления и, следовательно, не обращало на это внимания.

Таким образом, суть в том, что вызов рендеринга не должен выходить из контроллера, сборка модели электронной почты должна.

Теперь, если вы делаете все это, это означает, что я не понял вашего вопроса и требует дополнительных объяснений.

0 голосов
/ 26 июня 2013

Я использовал 2 метода для рендеринга Razor электронных писем, которые должны быть отправлены за пределы контроллера ... Сначала я передал ControllerContext на мой уровень обслуживания, который работал как положено, но не идеально ... Часто мои услуги используется приложениями командной строки или компилируется в службу Windows, где нет доступного ControllerContext ... При второй попытке я использовал этот механизм рендеринга Razor: http://razorengine.codeplex.com/ или https://github.com/Antaris/RazorEngine

0 голосов
/ 05 февраля 2012

Вы можете создать экземпляр или статическое свойство BaseController в классе помощника, как показано ниже,

public sealed class Helper {
///Gets or sets BaseController
public BaseController { get; set; }
#region "Constructors"
/// <summary>
/// Initialises a new instance of the <see cref="Helper" /> class.
/// </summary>
public Helper() : base() {

}
/// <summary>
/// Initialises a new instance of the <see cref="Helper" /> class.
/// </summary>
public Helper(BaseController baseController) : this() {
   this.BaseController = baseController;
}
#endregion
public void SendEmail(){
   // Here you can call your RenderPartialViewToString from the BaseController
 var m_RenderPartialViewToString = this.BaseController.RenderPartialViewToString( .......);
}}

С уважением.Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...