【发布时间】:2014-10-14 14:07:57
【问题描述】:
我正在用 asp mvc 开发一个应用程序,我想为开发人员创建一些友好的控件,例如 asp.net WebForms 中的 Server 控件。在这种情况下,我想创建一个引导面板,它有一些固定的 html 并在项目模板中呈现。我是这样做的:
public static MvcHtmlString BootPanel<T>(this IEnumerable<T> items, Func<T, HelperResult> template, string title = "")
{
StringBuilder sb = new StringBuilder();
sb.Append("<div class='panel panel-info'>");
sb.Append("<div class='panel-heading'>");
sb.Append(title);
sb.Append("</div>");
sb.Append("<div class='panel-body'>");
var hr = new HelperResult(writer =>
{
foreach (var item in items)
{
template(item).WriteTo(writer);
}
});
sb.Append(hr.ToHtmlString());
sb.Append("</div>");
sb.Append("</div>");
return MvcHtmlString.Create(sb.ToString());
}
这是剃刀视图:
@{
var videoGames = new[] {
new VideoGame {nombre = "Shadows of mordor", precio = 66},
new VideoGame {nombre = "Spiderman", precio = 50}
};
}
@videoGames.BootPanel(@<div>
@item.nombre @item.precio
</div>
, "Titulo")
使用引导类正确呈现输出:
问题是。这是实现这种控制的正确方法吗?
编辑:
根据您的回答,我更新了您使用 TagBuilder 的助手:
public static MvcHtmlString BootPanel<T>(this IEnumerable<T> items, Func<T, HelperResult> template, string title = "")
{
TagBuilder PanelDiv = new TagBuilder("div");
PanelDiv.AddCssClass("panel panel-info");
TagBuilder PanelHeading = new TagBuilder("div");
PanelHeading.AddCssClass("panel-heading");
PanelHeading.SetInnerText(title);
TagBuilder PanelBody = new TagBuilder("div");
PanelBody.AddCssClass("panel-body");
var hr = new HelperResult(writer =>
{
foreach (var item in items)
{
template(item).WriteTo(writer);
}
});
PanelBody.InnerHtml = hr.ToHtmlString();
PanelDiv.InnerHtml = PanelHeading.ToString() +
PanelBody.ToString();
return MvcHtmlString.Create(PanelDiv.ToString());
}
【问题讨论】:
-
在我看来你的方法没有错
-
@EhsanSajjad 感谢您的评论
-
没关系。我唯一建议的是使用
TagBuilder而不是StringBuilder。以这种方式确保输出干净的净化过的 HTML 要容易得多,并且在添加属性、CSS 类等方面也更容易使用。 -
如何使用 tagbuilder 嵌套控件?
-
outerDivBuilder.InnerHTML = innerDivBuilder.ToString();。也可以使用+=追加。
标签: c# .net asp.net-mvc html-helper