Получать сгенерированный HTML программно против HttpWebRequest - PullRequest
0 голосов
/ 22 января 2011

Для нашего информационного бюллетеня я создаю окончательное тело письма на веб-странице и затем хочу вставить его в тело письма. Я нашел способ сделать это с HttpWebRequest.

    private string GetHtmlBody(Guid id)
    {
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(String.Format("http://news.domain.com/News/View/{0}", id.ToString()));
        HttpWebResponse responce = (HttpWebResponse)request.GetResponse();
        System.IO.StreamReader sr = new System.IO.StreamReader(responce.GetResponseStream());

        return sr.ReadToEnd();
    }

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

Ответы [ 3 ]

1 голос
/ 22 января 2011

Вы можете использовать MVCContrib для этой задачи .

Или попробуйте бросить некрасивый код:

public static string ViewToString(string controlName, object viewData)
{
    var vd = new ViewDataDictionary(viewData);
    var vp = new ViewPage { ViewData = vd };
    var control = vp.LoadControl(controlName);
    vp.Controls.Add(control);
    var sb = new StringBuilder();
    using (var sw = new StringWriter(sb))
    using (HtmlTextWriter tw = new HtmlTextWriter(sw))
    {
        vp.RenderControl(tw);
    }
    return sb.ToString();
}

, а затем:

var viewModel = ...
string template = ViewToString("~/Emails/EmailTemplate.ascx", viewModel);
0 голосов
/ 24 января 2011

Наконец-то получил рабочее решение. После нахождения некоторых правильных поисковых терминов (благодаря @Darin) во многих, многих исследованиях я нашел решение, которое работает . Поместив это в мой контроллер, затем передав визуализированную строку в мой EmailHelper, отлично работает для того, что мне нужно.

0 голосов
/ 22 января 2011

Предполагая, что код электронной почты находится в том же проекте, что и веб-сайт, вы сможете вызвать метод действия, получить ActionResult обратно, а затем вызвать метод ExecuteResult. Недостатком является то, что для того, чтобы сделать это таким образом, вам нужно настроить его так, чтобы ExecuteResult записывал в поток, которым вы можете воспользоваться. Чтобы сделать все это, вам нужно будет смоделировать некоторые классы, используемые ControllerContext.

Что, вероятно, будет лучшим способом (хотя, вероятно, потребует больше работы), это иметь разметку, которую вы хотите сгенерировать с помощью преобразования XSLT. XSLT - это тип шаблона документа XML, который можно объединить с документом XML, который содержит данные для получения желаемого результата. Если вы сделаете это, то ваш процесс, который рассылает электронные письма, будет запускать преобразование, а также запускать преобразование на вашем веб-сайте. Преимущество этого состоит в том, что если вы хотите, чтобы разметка была другой (то есть вы перепроектировали информационный бюллетень w), вам просто нужно обновить файл XSLT и развернуть его.

НТН

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