我想我想要做的是将我的数据“链接”下来,以便最终看起来一样。 我的所有html必须以某种形式包装
<fieldset class="" data-role="">
所以我所拥有的是一个打印各种表格的助手。一个是标签:
<fieldset data-role="@role">
<label>@Html.Raw(label)</label>
</fieldset>
现在我有多种类型的标签,其中一种包括代码块。当它是一个 简单的文字,比如“名字”:
@FieldSet.Label("First Name")
但是当我有一个代码块,例如:
<b>some text</b>
<p>some other text (some time frame - some time frame)
使用它变得复杂:
@FieldSet.Label("<b>" + Model.Text1 + "</b><p>" + Model.Text2 +
" (" + Model.Time1 + " - " + Model.Time2 +")</p>")
我想要一个看起来像这样的解决方案:
@FieldSet.Label(@<text>
<b>@Model1.Text1</b>
<p>@Model.Text2 (@Model.Time1 - @Model.Time2)</p>
</text>)
我在某个地方看到这是可能的,但我找不到这篇文章。我可能完全被误导,但我真的不想在后面的代码中有一段HTML,我想利用剃刀语法,而不是字符串连接。
答案 0 :(得分: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>");
});
}
}
所以你可以写
@Html.Label(@<text><span>@Model.Item1<span><strong>@Model.Item2</strong></text>)
将模型作为辅助方法的参数传递
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>");
});
}
}
用法:
@FieldSet.Label(Model, @<div><span>@Model.UserName</span><strong>@Model.FullName</strong><p>@Model.Description</p></div>)
答案 1 :(得分:3)
您可以查看@Html.BeginForm
的实施方式。
创建一个实现IDisposable的类,并直接写入Response流:
您的代码可能如下所示(由头部输入,未经测试):
class FieldSet : IDisposable {
public FieldSet(string label) {
// TODO: Encode label on line below
HttpContext.Current.Response.Write(string.Format("<fieldset><label =\"{0}\"", label));
}
public void Dispose() {
HttpContext.Current.Response.Write("</fieldset>");
}
}
static class FieldSetExtionsions {
public static FieldSet FieldSet(this HtmlHelper html, string label) {
return new FieldSet(label);
}
}
用法将是:
@using (Html.FieldSet("your label")) {
<div>
Your razor code goes here
</div>
}