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

时间:2012-02-04 22:33:05

标签: 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();
        }
    }
}

目前,它存在于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

3 个答案:

答案 0 :(得分:2)

我认为你走在正确的轨道上,但问题在于你渴望完成分离,这太过于急切了。

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

我相信你需要制作(如果还没有制作):

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

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

现在,如果你正在做所有这些,这意味着我没有理解你的问题,需要更多的解释。

答案 1 :(得分:0)

您可以在帮助程序类中创建BaseController的实例或静态属性,如下所示,

public sealed class Helper {
///Gets or sets BaseController
public BaseController { get; set; }
#region "Constructors"
/// <summary>
/// Initialises a new instance of the <see cref="Helper" /> class.
/// </summary>
public Helper() : base() {

}
/// <summary>
/// Initialises a new instance of the <see cref="Helper" /> class.
/// </summary>
public Helper(BaseController baseController) : this() {
   this.BaseController = baseController;
}
#endregion
public void SendEmail(){
   // Here you can call your RenderPartialViewToString from the BaseController
 var m_RenderPartialViewToString = this.BaseController.RenderPartialViewToString( .......);
}}

的问候。希望这会有所帮助。

答案 2 :(得分:0)

我使用了两种Razor渲染电子邮件的方法,需要将它们发送到控制器一侧...首先我将ControllerContext传递给我的服务层,该服务层按预期工作,但不理想....通常我的服务是由命令行应用程序使用或编译到没有ControllerContext可用的Windows服务中...在我第二次尝试时,我使用了这个Razor渲染引擎:http://razorengine.codeplex.com/https://github.com/Antaris/RazorEngine