2014-04-11 49 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作为参数。