【问题标题】:Mvc UserControl using HtmlHelper with HelperResult and MvcHtmlStringMvc UserControl 使用 HtmlHelper 和 HelperResult 和 MvcHtmlString
【发布时间】: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  &nbsp;  @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


【解决方案1】:

确保在返回之前对输出字符串进行编码,因为如果有人为标题编写了 javascript,则会导致脚本注入。除了它看起来之外,您可以使用 TagBuilder 类来构建您的 html 代码,而不是使用硬编码标签。看到这个example

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-23
    • 2013-06-15
    • 1970-01-01
    • 2015-01-14
    相关资源
    最近更新 更多