2016-07-26 62 views
1

在asp.net核心1.0(Full Framework 4.6.1)中,我需要渲染一个局部视图到字符串,所以基于https://gist.github.com/ahmad-moussawi/1643d703c11699a6a4046e57247b4d09,我创建的RenderView:当在asp.net核心1.0中渲染部分视图时,ViewBag数据不存在

public class ViewRender 
{ 
    private IRazorViewEngine _viewEngine; 
    private ITempDataProvider _tempDataProvider; 
    private IServiceProvider _serviceProvider; 

    public ViewRender(
     IRazorViewEngine viewEngine, 
     ITempDataProvider tempDataProvider, 
     IServiceProvider serviceProvider) 
    { 
     _viewEngine = viewEngine; 
     _tempDataProvider = tempDataProvider; 
     _serviceProvider = serviceProvider; 
    } 

    public string Render<TModel>(string view, TModel model) 
    { 
     var actionContext = GetActionContext(); 

     var viewEngineResult = _viewEngine.FindView(actionContext, view, false); 

     if (!viewEngineResult.Success) 
     { 
      throw new InvalidOperationException(string.Format("Couldn't find view '{0}'", view)); 
     } 

     var viewResult = viewEngineResult.View; 

     using (var output = new StringWriter()) 
     { 
      var viewContext = new ViewContext(
       actionContext, 
       viewResult, 
       new ViewDataDictionary<TModel>(
        metadataProvider: new EmptyModelMetadataProvider(), 
        modelState: new ModelStateDictionary()) 
       { 
        Model = model 
       }, 
       new TempDataDictionary(
        actionContext.HttpContext, 
        _tempDataProvider), 
       output, 
       new HtmlHelperOptions()); 

      viewContext.Vi 
      viewResult.RenderAsync(viewContext).GetAwaiter().GetResult(); 

      return output.ToString(); 
     } 
    } 

    private ActionContext GetActionContext() 
    { 
     var httpContext = new DefaultHttpContext(); 
     httpContext.RequestServices = _serviceProvider; 
     return new ActionContext(httpContext, new RouteData(), new ActionDescriptor()); 
    } 
} 

然而,当控制器调用PartialView:

string render = _viewRender.Render("Directory/_DirectoryData", directory); 

数据集分成ViewBag控制器先前如下。

<label asp-for="DirectoryItem_DirectoryItem" class="form-control-label"></label> 
<select asp-for="DirectoryItem_DirectoryItem" asp-items="@(new SelectList(ViewBag.DirectoryList, "Id", "DirectoryId", null))" class="form-control"> 
    <option>--- Seleccione ---</option> 
</select> 

和渲染抛出异常:当使用它们的组合框项目

ViewBag.ParticipantTypesList = _dbInstance.ParticipantTypes; 
ViewBag.DirectoryList = _dbInstance.Directories; 
ViewBag.TaxCategoryList = _dbInstance.TaxCategories; 

不存在。请帮助我如何获取或传输ViewBag。

¿我必须使用_viewEngine.FindView(...)或_viewEngine.FindPage(...)?

谢谢

回答

1

我已经找到答案了!

我不需要渲染局部视图到一个让我头痛的字符串。在控制器中使用return PartialView返回一个字符串给javascript中的ajax函数调用者,因此ViewBag变量可以在没有问题的情况下被访问到cshtml局部视图中。