c# - Mvc UserControl 使用 HtmlHelper 与 HelperResult 和 MvcHtmlString

标签 c# .net asp.net-mvc html-helper

我正在用 asp mvc 开发应用程序,我想为开发人员创建一些友好的控件,例如 asp.net WebForms 中的服务器控件。在这种情况下,我想创建一个引导面板,它有一些固定的 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());
    }

这是 Razor View :

@{
  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")

使用 Bootstrap 类正确呈现输出:

enter image description here

问题是。这是实现这种控制的正确方法吗?

编辑:

根据您的回答,我更新了您使用的 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());
    }

最佳答案

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

关于c# - Mvc UserControl 使用 HtmlHelper 与 HelperResult 和 MvcHtmlString,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26362910/

相关文章:

.net - VS2008,没有嵌入应用程序图标?

c# - 2台redis服务器可以共享同一个快照转储文件吗?

asp.net-mvc - ActionInvoker.InvokeAction(context, "Method") - 如何将参数传递给调用的方法?

asp.net-mvc - Kendo mvc 网格打印

c# - ASP.NET MVC 表单是否会自动填充字段?

c# - 为什么我无法从资源中获取自定义字体?

.net - MonoTouch/MonoDevelop Ad Hoc 构建失败,但项目包 ID 和配置文件匹配

c# - 在 ASP.NET WebApi 2 : How to set cookies? 中测试 OWIN 中间件

c# - Asp.Net 在 json 中返回自定义对象

asp.net-mvc - MVC - InvalidOperationException : UserId not found