MVC的用户控件使用的HtmlHelper与HelperResult和MvcHtmlString [英] Mvc UserControl using HtmlHelper with HelperResult and MvcHtmlString

查看:674
本文介绍了MVC的用户控件使用的HtmlHelper与HelperResult和MvcHtmlString的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在开发的ASP MVC应用程序,我想创造一些友好的控制对于开发商来说,就像在asp.net的WebForms服务器控件。在这种情况下,我想创建自举面板,有一些固定的HTML和呈现的项目的模板内。我这样做是这样的:

 公共静态MvcHtmlString BootPanel< T>(这IEnumerable的< T>的项目,Func键< T,HelperResult>模板,字符串标题=)
    {

     StringBuilder的SB =新的StringBuilder();
     sb.Append(< D​​IV CLASS ='面板面板信息>中);
     sb.Append(< D​​IV CLASS ='面板标题>中);
     sb.Append(职称);
     sb.Append(< / DIV>中);
     sb.Append(< D​​IV CLASS ='面板体>中);

     VAR小时=新HelperResult(作家=>
              {
                 的foreach(在项目VAR项)
                {
                  模板(项目).WriteTo(作家);
                }
       });

      sb.Append(hr.ToHtmlString());
      sb.Append(< / DIV>中);
      sb.Append(< / DIV>中);
      返回MvcHtmlString.Create(sb.ToString());
    }
 

这是剃刀查看:

  @ {
  VAR视频游戏=新的[] {
      新的视频游戏{NOMBRE =暗影魔多,preCIO = 66},
      新的视频游戏{NOMBRE =蜘蛛侠,preCIO = 50}
      };
   }

  @ videoGames.BootPanel(@< D​​IV>
                            @ item.nombre&放大器; NBSP; @项目。preCIO
                        < / DIV>
                      TITULO)
 


输出呈现正确使用自举类:

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

编辑:

随着你的答案我更新了帮手哟使用TagBuilder:

 公共静态MvcHtmlString BootPanel< T>(这IEnumerable的< T>的项目,Func键< T,HelperResult>模板,字符串标题=)
    {
        TagBuilder PanelDiv =新TagBuilder(分区);
        PanelDiv.AddCssClass(面板面板信息);

        TagBuilder PanelHeading =新TagBuilder(分区);
        PanelHeading.AddCssClass(面板标题);
        PanelHeading.SetInnerText(职称);

        TagBuilder PanelBody =新TagBuilder(分区);
        PanelBody.AddCssClass(面板体);

        VAR小时=新HelperResult(作家=>
        {


            的foreach(在项目VAR项)
            {
                模板(项目).WriteTo(作家);
            }

        });

        PanelBody.InnerHtml = hr.ToHtmlString();

        PanelDiv.InnerHtml = PanelHeading.ToString()+
                             PanelBody.ToString();

        返回MvcHtmlString.Create(PanelDiv.ToString());
    }
 

解决方案

请C的输出字符串确保您连接$ C $,因为如果有一个人写了一个JavaScript的标题,然后它会导致脚本注入返回。除此之外,它看起来,但使用而不是硬codeD标签,你可以使用TagBuilder类来建立你的HTML code。看到这个<一href="http://www.asp.net/mvc/tutorials/older-versions/views/using-the-tagbuilder-class-to-build-html-helpers-cs"相对=nofollow>例如。

I'm developing an application in asp mvc, and I want to create some friendly controls for developers, like Server controls in asp.net WebForms . In this case, I want to create a bootstrap panel that has some fixed html and render inside a template of items. I am doing it this way:

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());
    }

This is the 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")


The output is rendered correctly using the bootstrap classes:

The question is. Is this a correct way of implementing this kind of control?

EDIT:

Following your answers I updated the helper yo use 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());
    }

解决方案

Make sure you encode the output string before returning since if some one writes a javascript for title then it results in script injection. Apart from that it looks, but instead using hard coded tags you may use TagBuilder class to build your html code. See this example.

这篇关于MVC的用户控件使用的HtmlHelper与HelperResult和MvcHtmlString的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆