1

我知道有几个类似的问题可以解决这个话题,但我对答案不满意。

我想要的是充分利用 Razor View 引擎,它可以将强类型视图与布局页面和部分视图一起使用。我想在我的视图顶部声明模型并传入该模型。很简单!没有动态模型需要在将它们传递到视图之前显式构建。编辑:我想在 Web 应用程序之外,在可以构造电子邮件正文的类库中执行此操作。这里真正的问题是使用不是 Web 应用程序的 Razor 视图引擎。

这背后的想法是,如果我有一个User包含 20 个属性的对象,并且我的第一个版本的欢迎电子邮件仅使用名称,但稍后我想编辑模板以使用他们的City,StateEmail地址,那么我希望能够无需添加代码并重新编译和重新部署即可更新 Razor 视图。

我看到RazorEngine,我喜欢这个想法和简单性,但一切都是动态类型。我的问题是我将从数据库中提取数据作为模型。由于必须将事物推入动态类型,我无法在视图上获得所有属性。

我还看到了 MvcMailer,它在理论上也很好,但它也存在同样的问题,即传递到视图中的所有数据模型都是动态的并且不是强类型的。

我已经开始构建我自己的版本,这将需要几个 Web 命名空间,例如 System.Web.Mvc、System.Web.Razor 和 System.Web.WebPages - 我可以接受。问题是缺少 HttpContext 和 ControllerContext 和 RouteData .... 我正在尝试模拟/存根。我目前正在尝试研究 DisplayModes 并弄清楚如何在真实的 Web 环境之外模拟这些。

有没有更好的办法?如果您要建议前面提到的两个框架之一,请注意我的问题并让我知道是否有解决方法。

编辑 2:在使用了 RazorEngine 之后,强类型模型并不一定像我想象的那么严重。我现在只希望能够使用布局页面和部分视图。我可以用被替换的字符串占位符来解决这个问题,但可能不是很有效而且不是很灵活。

4

4 回答 4

4

假设您试图从控制器的操作方法中实现这一点,这里有一个简单的方法来做到这一点。

此方法将为您提供强类型视图的输出:

public static string RenderViewToString(this Controller controller, string viewName, object model)
{
    controller.ViewData.Model = model;
    try
    {
        using (StringWriter sw = new StringWriter())
        {
            ViewEngineResult viewResult = ViewEngines.Engines.FindView(controller.ControllerContext, viewName, null);
            ViewContext viewContext = new ViewContext(controller.ControllerContext, viewResult.View, controller.ViewData, controller.TempData, sw);
            viewResult.View.Render(viewContext, sw);
            viewResult.ViewEngine.ReleaseView(controller.ControllerContext, viewResult.View);

            return sw.ToString();
        }
    }
    catch(Exception ex)
    {
        return ex.ToString();
    }
}

然后从控制器方法中,您需要做的就是使用视图和模型的名称调用此方法。

public ActionResult Mail()
{
    // whatever you use to get your User object
    var model = new User();

    var output = this.RenderViewToString("~/Views/User/Email.cshtml", model)
}

这将允许您模拟强类型视图的呈现,包括其关联的布局,并将输出收集为字符串,然后您可以使用该字符串通过电子邮件发送。

于 2012-09-30T06:32:09.593 回答
0

试用Actionmailer.net:https://bitbucket.org/swaj/actionmailer.net/wiki/Home

我一直在非常成功地使用它。

于 2013-01-20T04:59:49.460 回答
0

答案是传入的对象是否是动态的似乎并不重要。我可以传递我的强类型对象,它会按原样被接受,而无需使其成为动态对象或重建动态对象。

我的初步测试表明这应该没问题并且运行良好。

于 2012-10-17T00:54:22.487 回答
0

查看RazorMachine。它类似于 RazorEngine,但适用于布局。

于 2013-04-14T17:59:48.337 回答