2014-04-01 43 views
2

我有一個返回partialview一個動作,我想呈現的動作結果字符串,我試過很多例子表明對他人線程關於這個問題,但都具有相同的行爲,執行去查看,但不是行動,這可能嗎?渲染動作,以字符串

實施例: 1)作用 - 局部視圖來渲染到串

public PartialViewResult Email(string Subject, string Body) 
    { 
     ViewBag.Subject = Subject; 
     ViewBag.Body = Body; 

     ViewBag.ExtraData = Session["ExtraData"]; 

     return PartialView(); 
    } 

2)局部視圖

@{ 
    Layout = null; 
    string Subject = (string)@ViewBag.Subject 
    string Body = (string)@ViewBag.Body 
} 
<html> 
<head> 
    <title>@Subject</title> 
</head> 
<body style="margin:0px"> 
     @Body 
</body> 

3)控制器類獲得串動作結果

var emailHTML = RenderViewToString(ControllerContext, "Email", new string[] { subject, msg }); 

4)從stackoverflow線程的幫手方法

public static string RenderViewToString(ControllerContext context, string viewName, object model) 
    { 
     if (string.IsNullOrEmpty(viewName)) 
      viewName = context.RouteData.GetRequiredString("action"); 

     ViewDataDictionary viewData = new ViewDataDictionary(model); 

     using (StringWriter sw = new StringWriter()) 
     { 
      ViewEngineResult viewResult = ViewEngines.Engines.FindPartialView(context, viewName); 
      ViewContext viewContext = new ViewContext(context, viewResult.View, viewData, new TempDataDictionary(), sw); 
      viewResult.View.Render(viewContext, sw); 

      return sw.GetStringBuilder().ToString(); 
     } 
    } 

如果我調試代碼,它直接進入沒有ViewBag數據的View,並且不執行Email Action方法。

任何想法?

+0

它沒有幫助遺憾,同樣的問題的代碼 – Santiago

回答

7

該助手對於直接渲染視圖非常有用,但不是一個操作。也就是說,你甚至不會打電話給你想要的那個動作。相反,該代碼只是查找一個視圖並將其直接呈現給提供模型的作者。

我們想要做的實際上是調用Email()PartialViewResult和渲染。

觀察:

using (var sw = new StringWriter()) 
{ 
    PartialViewResult result = Email("Subject", "Body"); 

    result.View = ViewEngines.Engines.FindPartialView(ControllerContext, "Email").View; 

    ViewContext vc = new ViewContext(ControllerContext, result.View, result.ViewData, result.TempData, sw); 

    result.View.Render(vc, sw); 

    var html = sw.GetStringBuilder().ToString(); 
} 
+0

那行這就是我一直在尋找,簡單有效!非常感謝你! – Santiago