如何在 .Net Core MVC 中将 csHtml 传递给 ViewComponent?

4
我想要将 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>

这真的可能吗?我一直在搜索,但没有找到如何做到这一点的示例。


编辑:成功了!感谢大家的帮助。

以下是一些示例代码,演示如何实现此功能:

调用 ViewComponent:

@{
    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>
2个回答

3
您应该能够将参数添加到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>") })

您的ViewComponent 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来传递当然也是一种选择。

1

是的,这是可能的,你需要想出一种解决方法,但是它是可以实现的,这个答案有一个你正在寻找的示例。


1
这实际上是一个重复的问题吗? - user4864425
不完全相同,但非常相似。 - Albondi
我尝试了那个解决方案,但对我没有用。当我尝试传递csHtml时,我会得到这个编译时错误:“无法隐式转换类型'System.Func<dynamic, object>'为'Microsoft.AspNetCore.Html.HtmlString'”。 - Ryan
以下是代码: @{Func<dynamic, object> children = @<div> <p>aaaa</p> <p>bbbb</p> <p>ccccc</p> </div>}<vc:some-component body=@children> </vc:some-component> - Ryan
我的错,我忘记加分号了。现在它可以渲染了,但在页面上看起来像这样“System.Func`2[System.Object,System.Object]”,它无法正确地呈现实际的HTML。 - Ryan
不得不调用invoke!现在一切都好了,我会用解决方案更新我的问题。 - Ryan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接