2016-07-26 9 views
1

asp.netコア1.0(フルフレームワーク4.6.1)では、部分ビューを文字列にレンダリングする必要があったため、https://gist.github.com/ahmad-moussawi/1643d703c11699a6a4046e57247b4d09に基づいて、私は次のように以前ViewBagコントローラに設定asp.netコア1.0のレンダリング部分ビューの場合

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

データ:

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を呼び出す:RenderViewを作成しました。コンボボックスのアイテムのためにそれらを使用する際に

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

は存在しません:

<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を取得または転送する方法を教えてください。

¿_viewEngine.FindView(...)または_viewEngine.FindPage(...)を使用する必要がありますか?

ありがとうございました

答えて

1

私は自分で答えを見つけました!

私は頭痛を引き起こしていた文字列に部分的な表示をする必要はありません。戻り値PartialViewをControllerに返すと、javascriptのajax関数呼び出し側に文字列が返されるため、ViewBag変数には問題なくcshtmlの部分ビューにアクセスできます。

関連する問題