【发布时间】: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