2014-04-11 43 views
3

用下面的代碼:無法找到視圖

static string RenderViewToString(ControllerContext context,string viewPath,object model = null,bool partial = false) 
{ 
    // first find the ViewEngine for this view 
    ViewEngineResult viewEngineResult = null; 
    if (partial) 
     viewEngineResult = ViewEngines.Engines.FindPartialView(context, viewPath); 
    else 
     viewEngineResult = ViewEngines.Engines.FindView(context, viewPath, null); 

    if (viewEngineResult == null) 
     throw new FileNotFoundException("View cannot be found."); 

    // get the view and attach the model to view data 
    var view = viewEngineResult.View; 
    context.Controller.ViewData.Model = model; 

    string result = null; 

    using (var sw = new StringWriter()) 
    { 
     var ctx = new ViewContext(context, view, 
            context.Controller.ViewData, 
            context.Controller.TempData, 
            sw); 
     view.Render(ctx, sw); 
     result = sw.ToString(); 
    } 

    return result; 
} 

這一行後:執行

viewEngineResult = ViewEngines.Engines.FindPartialView(context, viewPath); 

,我發現viewEngineResult爲NULL,我相信意味着觀點並沒有發現即使我將它正確放置在相同的路徑中。

+1

歡迎來到Stack Overflow。我已將您的問題標題更新爲您遇到的實際相關問題。這與視圖做什麼並不重要,試圖解決的實際問題(除非我錯了)是您的視圖沒有找到。 –

+0

謝謝....是的,你是正確的看法沒有找到,但我給出了確切的路徑.. :( –

+0

你是什麼意思的「把它放在同一路徑」?IIRC,FindPartialView使用「按照慣例「搜索將在控制器的Views子文件夾中查找,然後在Shared中傳遞給該調用的內容不是視圖的路徑,而只是視圖名稱 –

回答

1

我不知道爲什麼你的代碼返回null,但是這對我的作品在控制器的情況下:

public string RenderRazorViewToString(string viewName, object model = null) 
    { 
     ViewData.Model = model; 
     using (var sw = new System.IO.StringWriter()) 
     { 
      var viewResult = ViewEngines.Engines.FindPartialView(ControllerContext, viewName); 
      var viewContext = new ViewContext(ControllerContext, viewResult.View, ViewData, TempData, sw); 
      viewResult.View.Render(viewContext, sw); 
      return sw.GetStringBuilder().ToString(); 
     } 
    } 

用法:

var result = RenderRazorViewToString("_GridHeaderStudentCell"); 

你可以很容易地修改此儘管將ControllerContext作爲參數。