Визуализация частичного представления MVC в не-MVC-проекте из DLL-библиотеки, на которую ссылается MVC - PullRequest
0 голосов
/ 21 февраля 2012

Я знаю, что по этой теме вы, вероятно, думаете "что, черт возьми".Но позвольте мне объяснить!

У меня есть два проекта: MyMVCWebsite - веб-сайт MVC, работающий в Windows Azure. MyWebsiteWorker - отдельный проект DLL, работающий в отдельной рабочей роли Windows Azure.Это ссылается на MyMVCWebsite как DLL, так как он использует часть своего кода.

У меня есть контроллер под названием Email, а действия - это разные типы электронных писем, которые мы отправляем, например / Email / DailyNewsletter (модель: userDetails)

Контроллер предоставляет метод RenderPartialViewAsString, который позволяет мне отображать / Email / DailyNewsletter / userDetails в строку, которую я мог бы затем отправить в HtmlBody письма.

Это все нормально иДенди, если я хочу отправлять эти электронные письма с веб-сервера, но я этого не делаю.

Я хочу иметь возможность визуализировать частичное представление из MyWebsiteWorker, используя что-то вроде:

For each user in usersToEmail
  Dim _con as new EmailController
  SendEmail(user.emailAddress, _con.RenderPartialViewAsString(user))
next

Очевидно, это не работает (вы даже не можете создать новый экземпляр EmailController)

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

Ответы [ 2 ]

0 голосов
/ 10 октября 2013

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

У меня была такая же проблема в проекте, как я использовал RazorEngine . Для этого вы должны использовать весь вид в строке, а затем проанализировать его с помощью RazorEngine и вашей модели, это, конечно, имеет некоторые ограничения.

У меня есть представление в BLOB-объекте из хранилища Azure, и рабочая роль загружает его, а затем анализирует его с моделью.

Загрузка страницы формы лазурью:

CloudStorageAccount storageAccount = CloudStorageAccount.Parse(appSets["LocalEnvironmentStorageConnection"]);
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
CloudBlobContainer container = blobClient.GetContainerReference(appSets["LocalEnvironmentContainer"]);
CloudBlockBlob blockBlob = container.GetBlockBlobReference("LocalEnvironmentBlob");
string page;
using (var memoryStream = new MemoryStream())
{
     blockBlob.DownloadToStream(memoryStream);
     page = System.Text.Encoding.UTF8.GetString(memoryStream.ToArray());
}

Выполните логику, чтобы модель имела правильную информацию, а затем проанализируйте страницу с помощью RazorEngine

string html = Razor.Parse(page, model);

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

_client.Send("", user.email, subject, html, offset);

Надеюсь, кому-нибудь это поможет

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

Зачем в первую очередь строить отправку электронной почты на сайт?Просто сделайте это частью внешнего приложения.Если вы хотите использовать Razor для своего шаблона электронной почты, установите для этого что-то вроде FluentEmail.Он устанавливает собственную версию движка Razor для рендеринга вида.Я не понимаю, почему это не сработает в не-веб-проекте.

http://lukencode.com/2010/04/11/fluent-email-in-net/

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