【问题标题】:ViewBag data doesn't exists when Rendering Partial View in asp.net core 1.0在 asp.net core 1.0 中渲染局部视图时 ViewBag 数据不存在
【发布时间】:2016-07-26 22:49:55
【问题描述】:

进入一个asp.net core 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 Controller 中如下。

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(...)?

谢谢

【问题讨论】:

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


    【解决方案1】:

    我自己找到了答案!

    我不需要将部分视图呈现给令我头疼的字符串。只需在 Controller 中使用 return PartialView 就会向 javascript 中的 ajax 函数调用者返回一个字符串,因此 ViewBag 变量可以毫无问题地访问到 cshtml 局部视图中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多