在asp.net core 1.0中渲染局部视图时,ViewBag数据不存在

时间:2016-07-26 22:49:55

标签: asp.net-mvc asp.net-core-mvc asp.net-core-1.0

进入asp.net核心1.0(Full Framework 4.6.1),我需要渲染部分视图到字符串,所以基于https://gist.github.com/ahmad-moussawi/1643d703c11699a6a4046e57247b4d09,我创建了一个RenderView:

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());
    }
}

但是当Controller调用PartialView时:

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

以前将数据设置到ViewBag控制器中如下。

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>

Render抛出一个异常。请帮我看看如何获​​取或转移ViewBag。

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

由于

1 个答案:

答案 0 :(得分:1)

我自己找到了答案!

我不需要将部分视图渲染到导致我头痛的字符串。只需将PartialView返回到Controller中,就可以在javascript中将字符串返回给ajax函数调用者,因此可以在没有问题的情况下将ViewBag变量访问到cshtml局部视图中。