2012-02-21 53 views
0

我从该主题知道您可能在想“究竟是什么”。但让我解释一下!从MVC引用的DLL渲染非MVC项目中的MVC部分视图

我有两个项目: MyMVCWebsite - 一个运行在Windows Azure上的MVC网站 MyWebsiteWorker - 一个独立的Windows Azure工作者角色上运行的DLL项目。这引用MyMVCWebsite作为DLL,因为它使用了它的一些代码。

我有一个名为电子邮件控制器和行动是不同类型的电子邮件我们发送,例如/电子邮件/ DailyNewsletter(型号:为userDetails)

控制器暴露了一个方法RenderPartialViewAsString这将让我来渲染/电子邮件/ DailyNewsletter/userDetails到一个字符串,然后我可以发送电子邮件的HtmlBody。

如果我想从网络服务器发送这些电子邮件,这是一切都很好,但我不知道。

我希望能够使用类似呈现来自MyWebsiteWorker局部视图:

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

显然,这并不正常工作(你甚至不能创造EmailController的新实例)

我想这样做,因为可能会有1000封电子邮件发送,并且我不希望将这些负载放在Web服务器上。

回答

0

为什么建立电子邮件发送到网站上呢?只需将其作为外部应用的一部分即可。如果您想为您的电子邮件模板使用Razor视图,请安装诸如FluentEmail之类的工具来执行此操作。它安装了它自己的Razor引擎版本来进行视图渲染。我不明白为什么它不适用于非web项目。

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

0

我我有点晚了一点,以帮助你,而是让这回应,我在这里留下这个。

我在一个项目中遇到了同样的问题,我这样做的方式是使用RazorEngine。为此,您可以在字符串中使用整个视图,然后使用RazorEngine和模型对其进行解析,当然这存在一些限制。

我从azure存储中获得了我的视图,并且worker角色将其下载并随后使用模型对其进行解析。

下载页面形式蔚蓝:

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); 

希望对大家有所帮助