将Razor视图渲染为字符串,从另一个控制器调用时不工作。失去上下文?

时间:2013-05-12 00:22:49

标签: c# asp.net asp.net-mvc-4 razor

我是MVC应用程序的新手,我正在尝试将razor视图渲染为字符串。当我从其自己的控制器中调用它时,我的代码工作得很好,但是当我尝试从另一个控制器调用控制器时,即使我发送ControllerContext,Controller上下文最终为null。我确信我正在丢失某个地方,而我无法弄清楚在哪里。

这是一些代码。

这是我呼叫控制器的地方。

var emailController = new EmailController();
emailController.ControllerContext = this.ControllerContext;
emailController.SendMail(entry.email, entry.first, entry.word);

这是我调用将返回html字符串的方法的地方。 “模板”是视图(Template.cshtml),而emailTemplate是我刚创建的模型。

var emailTemplate = new EmailModel 
{ 
    name = name,
    emailAddress = emailAddress,
    sent = "not Sent"
};    

htmlFromView = renderRazorViewToString("Template", emailTemplate);

这是我的方法,应该从视图中返回一个html字符串。问题是viewContext返回null。

private string renderRazorViewToString(string viewname, object model)
    {
        ViewData.Model = model;
        using (var sW = new StringWriter())
        {
            var viewResult = ViewEngines.Engines.FindPartialView(ControllerContext, viewname);
            var viewContext = new ViewContext(ControllerContext, viewResult.View, ViewData, TempData, sW);
            viewResult.View.Render(viewContext, sW);
            viewResult.ViewEngine.ReleaseView(ControllerContext, viewResult.View);
            return sW.GetStringBuilder().ToString();

        }
    }

如果我不从其他控制器调用EmailController,这可以完美地工作。我是否需要将上下文传递给模型或类似的东西?

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

这适用于部分。我认为只使用视图名称它也适用于非局部。

protected string RenderPartialViewToString(string viewName, object model)
{
    if (string.IsNullOrEmpty(viewName))
       viewName = ControllerContext.RouteData.GetRequiredString("action");
    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();
    }
 }

答案 1 :(得分:0)

我意识到我的问题是,因为我从另一个控制器调用了操作结果,所以它正在该控制器的库存搜索位置中查找正在调用其他操作结果的视图。

解决方案:将视图移动到该控制器的库存搜索位置,调用其他操作结果。