如何定义在asp.net核心中返回html的函数

Sha*_*dow 6 razor asp.net-core-mvc asp.net-core

基本上我需要像旧的asp.net

@helper MakeNote(string content) {
    <p><strong>Note</strong>&nbsp;&nbsp; @content    </p>
}
Run Code Online (Sandbox Code Playgroud)

或JSX

MakeNote(note) {
   return (<div>Note {note}</div>);
}
Run Code Online (Sandbox Code Playgroud)

部分视图不是一种选择.我很满意返回IHtmlString的函数,或写入底层编写器的函数.

它还需要在函数内部支持Razor语法(不仅仅是字符串连接).

Vit*_*tox 15

从ASP.NET Core 3.0 开始,我们可以在Razor 代码块中声明包含标记的本地函数作为模板方法:

@{
    void RenderName(string name)
    {
        <p>Name: <strong>@name</strong></p>
    }

    RenderName("Mahatma Gandhi");
    RenderName("Martin Luther King, Jr.");
}
Run Code Online (Sandbox Code Playgroud)

它呈现以下 HTML 代码:

<p>Name: <strong>Mahatma Gandhi</strong></p>
<p>Name: <strong>Martin Luther King, Jr.</strong></p>
Run Code Online (Sandbox Code Playgroud)

文档:https : //docs.microsoft.com/en-us/aspnet/core/mvc/views/razor?view=aspnetcore-3.0#razor-code-blocks


(只是为了完成)在ASP.NET Core 2.0 中,我们可以使用模板化 Razor 委托,结合<text></text>razor 标记(显式分隔转换),允许我们制作类似于过去的 ASP.NET MVC@helper标记的东西:

@{
    Func<string, object> RenderName = @<text>
        <p>
            Name: <strong>@item</strong>
        </p>;
    </text>;
}

<div>
    @RenderName("Victor")
</div>
Run Code Online (Sandbox Code Playgroud)

它呈现以下 HTML 代码:

<div>
    <p>
        Name: <strong>Victor</strong>
    </p>
</div>
Run Code Online (Sandbox Code Playgroud)

文档:https : //docs.microsoft.com/en-us/aspnet/core/mvc/views/razor?view=aspnetcore-2.0#templated-razor- delegates
文档<text></text>:https : //docs.microsoft.com/en -us/aspnet/core/mvc/views/razor?view=aspnetcore-2.0#razor-code-blocks

  • 如果你的函数返回 void ,那么在 html 标记中调用大括号内的函数。像这样: @{ RenderName("Victor"); } (6认同)

Sha*_*tin 8

您可能正在寻找@functions这种用途Html.Raw。

这是显示两种功能样式的示例。第一个使用传统的块体,第二个使用表达式体。

它们都$@在字符串上具有前缀。

  • 字符串中的$启用{interpoloation}。
  • 该@做逐字字符串,它可以跨越多行。

第三种方式有点像黑客,它使我们可以在函数内部解析Razor。就像我们似乎能够使用原始@helper语法一样。

SomeRazorFile.cshtml

@using Microsoft.AspNetCore.Html

@functions 
{
    IHtmlContent MakeNote(string content) 
    {
        return Html.Raw($@"
            <p>
                <strong>Note</strong> {content}
            </p>
        ");
    }

    // an alternative that uses method shorthand
    IHtmlContent MakeNoteToo(string content) => Html.Raw($@"
        <p>
            <strong>Note</strong> {content}
        </p>
    ");
}

@{
    // an alternative that parses razor
    Func<string, IHtmlContent> MakeNoteThree = 
        @<p>
            <strong>Note</strong> {@item}
        </p>;
}

<div>
    @MakeNote("Foo")
    @MakeNoteToo("Bar")
    @MakeNoteThree("Baz")
</div>
Run Code Online (Sandbox Code Playgroud)

编辑:添加了解析Razor的示例。有关详细信息,请参见https://github.com/aspnet/Razor/issues/715。

  • 它有点工作,但我想在该函数中使用 Razor,而不是字符串连接。 (3认同)