控制器外部的ControllerContext和ViewData - MVC3 C#

Jas*_*son 5 c# asp.net-mvc-3

我正在使用下面的方法渲染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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

目前,它存在于BaseController中,我想将其移出一个帮助方法,以便我可以移动我的电子邮件模型构建/发送出控制器.

问题是我无法访问ViewData/TempData/ControllerContext

我可以新建一个ControllerContext,但我不知道如何处理ViewData/TempData.

这就是我目前在Controller中使用的方法:

//Do Stuff in Controller

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

//Send the Email
Run Code Online (Sandbox Code Playgroud)

Ali*_*tad 2

我认为你的做法是对的,但问题是你急于彻底分离,实在是太急了。

您正在使用 Razor 视图引擎来呈现富文本 HTML 电子邮件。这是一种非常崇高的做法。然而,这意味着您将非常接近表示层,并且从控制器外部运行它 - 在我看来 - 没有多大意义。

我相信你需要制作(如果尚未制作):

  • 您的电子邮件 Razor 视为强类型
  • 让渲染照常在控制器中调用
  • 渲染就像将模型传递给 Render 方法一样简单
  • 将电子邮件模型的构建交给您想要的帮助者。这不需要任何表示层逻辑,因此不会注意到它。

所以重点是,渲染的调用不需要离开控制器,电子邮件模型的构建应该。

现在,如果您正在执行所有这些操作,则意味着我还没有理解您的问题并且需要更多解释。