进入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(...)?
由于
答案 0 :(得分:1)
我自己找到了答案!
我不需要将部分视图渲染到导致我头痛的字符串。只需将PartialView返回到Controller中,就可以在javascript中将字符串返回给ajax函数调用者,因此可以在没有问题的情况下将ViewBag变量访问到cshtml局部视图中。