Razor Helpers与代码块共享html问题

Bra*_*ney 5 asp.net html-helper razor asp.net-mvc-3

我想我想做的是"链接"我的数据,以便最终看起来一样.我的所有HTML必须以某种形式包装

<fieldset class="" data-role="">
Run Code Online (Sandbox Code Playgroud)

所以我有一个帮助打印各种形式.一个是标签:

<fieldset data-role="@role">
    <label>@Html.Raw(label)</label>
</fieldset>
Run Code Online (Sandbox Code Playgroud)

现在我有多种类型的标签,其中一种包括代码块.当它是一个简单的文本,如"名字",我做:

@FieldSet.Label("First Name")
Run Code Online (Sandbox Code Playgroud)

但是,当我有一个代码块,如:

<b>some text</b>
<p>some other text (some time frame - some time frame)
Run Code Online (Sandbox Code Playgroud)

使用它变得复杂:

@FieldSet.Label("<b>" + Model.Text1 + "</b><p>" + Model.Text2 + 
    " (" + Model.Time1 + " - " + Model.Time2 +")</p>")
Run Code Online (Sandbox Code Playgroud)

我想要一个看起来像这样的解决方案:

@FieldSet.Label(@<text>
<b>@Model1.Text1</b>
<p>@Model.Text2 (@Model.Time1 - @Model.Time2)</p>
</text>)
Run Code Online (Sandbox Code Playgroud)

我在某个地方看到这是可能的,但我找不到这篇文章.我可能完全被误导,但我真的不想在后面的代码中有一段HTML,我想利用剃刀语法,而不是字符串连接.

Vas*_*sea 4

查看 Phil Haack 的这篇文章

你可以:

作为强类型 HtmlHelper 的扩展方法编写:

public static class RazorExtensions
{
    public static HelperResult Label<T>(this HtmlHelper<T> helper, Func<T, HelperResult> template) {
        return new HelperResult(writer => {
            writer.Write("<label>");
            template(helper.ViewData.Model).WriteTo(writer);
            writer.Write("</label>");
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

所以你可以写

@Html.Label(@<text><span>@Model.Item1<span><strong>@Model.Item2</strong></text>)
Run Code Online (Sandbox Code Playgroud)

将模型作为参数传递给您的辅助方法

public static class FieldSet
{
    public static HelperResult Label<T>(this T model, Func<T, HelperResult> template) {
        return new HelperResult(writer => {
            writer.Write("<label>");
            template(model).WriteTo(writer);
            writer.Write("</label>");
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

用法:

@FieldSet.Label(Model, @<div><span>@Model.UserName</span><strong>@Model.FullName</strong><p>@Model.Description</p></div>)
Run Code Online (Sandbox Code Playgroud)