Mvc UserControl使用HtmlHelper与HelperResult和MvcHtmlString
我正在使用asp mvc开发一个应用程序,我想为开发人员创建一些友好的控件,比如asp.net WebForms中的Server控件。 在这种情况下,我想创建一个引导面板,它具有一些固定的html并在项目模板中呈现。 我是这样做的:
public static MvcHtmlString BootPanel(this IEnumerable items, Func template, string title = "") { StringBuilder sb = new StringBuilder(); sb.Append(""); sb.Append(""); sb.Append(title); sb.Append(""); sb.Append(""); var hr = new HelperResult(writer => { foreach (var item in items) { template(item).WriteTo(writer); } }); sb.Append(hr.ToHtmlString()); sb.Append(""); sb.Append(""); return MvcHtmlString.Create(sb.ToString()); }
这是剃刀查看:
@{ var videoGames = new[] { new VideoGame {nombre = "Shadows of mordor", precio = 66}, new VideoGame {nombre = "Spiderman", precio = 50} }; } @videoGames.BootPanel(@ @item.nombre @item.precio , "Titulo")
使用引导类正确呈现输出:
问题是。 这是实现这种控制的正确方法吗?
编辑:
根据你的回答我更新了帮助你使用TagBuilder:
public static MvcHtmlString BootPanel(this IEnumerable items, Func 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()); }
确保在返回之前编码输出字符串,因为如果有人为标题写了javascript,那么它会导致脚本注入。 除了它外观,但使用硬编码标签,您可以使用TagBuilder类来构建您的HTML代码。 看这个例子 。