首页 > 解决方案 > 如何在 .Net Core MVC 中将 csHtml 传递给 ViewComponent?

问题描述

我想将 csHtml 传递给 ViewComponent,如下所示:

<vc:some-component title="Title" 
body="@Html.Raw("<div>this is a nice div, my name is @Model.Name</div>")">
</vc:some-component>

如您所见,我想传递包含对变量或模型的引用的 HTML(这就是我将其称为 csHtml 而不仅仅是 Html 的原因)。

这是 ViewComponent 代码:

<div>
    <p>@Model.Title</p>
    @Model.Content
</div>

这甚至可能吗?我一直在搜索,但没有找到任何有关如何执行此操作的示例。


编辑:得到它的工作!感谢大家的帮助。

下面是一些关于如何做到这一点的示例代码:

调用视图组件:

@{
    Func<dynamic, object> children =
    @<div>
        <p style="color: white">aaaa</p>
        <p style="color: white">bbbb</p>
        <p style="color: white">bbbb</p>
    </div>;
}

<vc:some-component body=@children>
</vc:some-component>

查看组件内容:

@model SomeComponentModel

<div>
    @Model.Body("")
</div>

标签: asp.netasp.net-core.net-coreasp.net-core-2.0asp.net-core-viewcomponent

解决方案


您应该能够将参数添加到 ViewComponent 并随时将它们传递给 ViewComponent 视图本身。

<vc:some-component title="Title" 
body="@Html.Raw("<div>this is a nice div, my name is @Model.Name</div>")">
</vc:some-component>

或类似的东西

 @await Component.InvokeAsync("SomeComponent", new { title="Title", body= Html.Raw($"<div>this is a nice div, my name is {Model.Name}</div>") })

您的视图组件 IViewComponentResult 看起来像这样,使用 ViewBag 只是作为示例

public async Task<IViewComponentResult> InvokeAsync(string title, string body)
{
    //...
    ViewBag.Content = body;
    ViewBag.Title = title;
    //...
    return View();
}

然后在相关的 ViewComponent 视图中

<div>
    <p>@ViewBag.Title</p>
    @ViewBag.Content
</div>

创建一个更具体的 ViewModel 来传递也是一种选择


推荐阅读