我正在尝试ViewComponent
在ASP.NET Core 3.0(页面)中的服务中呈现为字符串。
我发现了两个部分解决方案,但都适用于3.0之前的旧版本,并且有一些我不知道如何解决的问题。
NullView
并被删除了3.0(实际上很难找到任何参考)。我做了一些自己的实验,但无法正常工作(我认为我所面临的问题与我发布的第二个解决方案相同)。对于此问题的任何帮助,我将不胜感激。我已将我的最佳尝试和最小项目添加到GitHub,其中Render位于Service文件夹中,而Index.cshtml.cs是对该服务的调用。
谢谢!
NullView
现在是内部类。但这是一个非常简单的类,什么也不做。换句话说,只需将其从src复制并粘贴到您的源代码中即可。您上面链接的教程用于呈现纯视图。但是,由于尝试渲染视图组件而不是视图,因此应避免直接传递视图路径。您应该改为传递ViewComponent类名(或Type)。
Model = await _viewRender.RenderToStringAsync(“ /Components/Test/Default.cshtml”,//不要传递视图路径,因为我们不是渲染视图文件,而是渲染视图组件 “ Test”, //因为`ViewComponent `名称为Test new TestModel {StrToPrint =“从服务打印”});
根据官方文档,运行时将在以下路径中搜索视图:
- / Views / {控制器名称} / Components / {View组件名称} / {View名称}
- / Views / Shared / Components / {查看组件名称} / {查看名称}
- / Pages / Shared / Components / {查看组件名称} / {查看名称}
但是,您的Test
ViewComponent驻留在中Pages/Components/Test/Default.cshtml
,默认情况下Razor找不到。配置自定义视图位置,或将其移动到标准位置,以便Razor可以找到视图文件。
最后,将ViewComponent呈现为页面似乎有些过大。我建议你应该使用IViewComponentHelper
呈现ViewComponent
为一个IHtmlContent
,这样我可以写到StringWriter
:
public class MyViewComponentContext
{
public HttpContext HttpContext { get; set; }
public ActionContext ActionContext { get; set; }
public ViewDataDictionary ViewData { get; set; }
public ITempDataDictionary TempData { get; set; }
}
private async Task<string> Render( MyViewComponentContext myViewComponentContext,string viewComponentName,object args) {
using (var writer = new StringWriter())
{
var helper = this.GetViewComponentHelper(myViewComponentContext, writer);
var result = await helper.InvokeAsync(viewComponentName, args); // get an IHtmlContent
result.WriteTo(writer, HtmlEncoder.Default);
await writer.FlushAsync();
return writer.ToString();
}
}
如果如上所述解决问题,则在运行项目时,我会得到正确的结果:
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句