在添加到面板的隐藏字段周围创建html的最佳方法是什么?

时间:2012-05-07 13:43:12

标签: c# .net

我将这些隐藏的输入字段添加到面板中:

foreach (Object obj in Objects)
{
    HiddenField hf = new HiddenField();
    hf.Value = "";
    hf.ID = "categoria" + obj.ID;
    panelCategorieGuida.Controls.Add(hf);
}

但是,在每个隐藏字段周围,我需要添加以下代码:

<div class="option-box"><a href="javascript:void(0);" class="option-box-item">&nbsp;</a>
    <span class="option-box-testo">Hello</span>
    <!-- HERE I NEED TO PUT THE HIDDEN FIELD i, so think to this whole option-box item into a cycle -->
</div>

我想避免在cs上写Literal并将其添加到面板中。

你能告诉我什么?

3 个答案:

答案 0 :(得分:2)

您可以使用Repeater控件,标记:

<asp:Repeater ID="catRep" runat="server" onitemcreated="catRep_ItemCreated">
  <ItemTemplate>
    <div class="option-box"><a href="javascript:void(0);" class="option-box-item">&nbsp;</a>
      <span class="option-box-testo">Hello</span>
      <asp:PlaceHolder ID="hiddenPlaceHolder" runat="server"></asp:PlaceHolder>          
    </div>
  </ItemTemplate>
</asp:Repeater>
代码背后的代码:

protected void catRep_ItemCreated(object sender, RepeaterItemEventArgs e)
{
  Control placeHolder = e.Item.FindControl("hiddenPlaceHolder");
  if (placeHolder != null)
  {
    MyItemClass my = (MyItemClass)e.Item.DataItem;
    HiddenField hf = new HiddenField();
    hf.Value = "";
    hf.ID = "categoria" + my.ID;
    placeHolder.Controls.Add(hf);
  }
}

当然,你必须将转发器绑定到对象列表

答案 1 :(得分:1)

您可以像这样使用HtmlGenericControl ..

HtmlGenericControl div = new HtmlGenericControl("div");
div.Attributes.Add("class", "option-box");

HtmlGenericControl a = new HtmlGenericControl("a") { InnerText = "&nbsp;" };
a.Attributes.Add("href", "javascript:void(0);");
a.Attributes.Add("class", "option-box-item");

HtmlGenericControl span = new HtmlGenericControl("span") { InnerText = "Hello" };
a.Attributes.Add("class", "option-box-testo");

div.Controls.Add(a);
div.Controls.Add(span);
div.Controls.Add(hf);

答案 2 :(得分:0)

如果你一遍又一遍地需要这种东西,你应该考虑将它变成user control,这样你就可以简单地编写你需要的东西,然后重复使用它,而不用担心它需要什么。此时,您可以将隐藏字段设置为您需要的任何内容,并稍后以编程方式访问它。

或者,更好的是,考虑Microsoft MVC是否合适,并将此类内容作为可替换视图。

根据评论进行编辑: 你对于如何使用这一点并不十分清楚,所以这对于我对隐藏字段的使用做出很多假设的事情是粗略的。

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="test.ascx.cs" Inherits="stuff.test" %>
<div class="option-box"><a href="javascript:void(0);" class="option-box-item">&nbsp;</a>
    <span class="option-box-testo">Hello</span>
    <asp:label id="label1" runat="server" visible="false"/>
</div>

然后在codebehind drop in:

    public Label HiddenField
    {
        get { return (Label)FindControl("label1"); }
    }

从那里你可以添加尽可能多的这些控件,无论你使用什么,都可以使用它,然后使用类似的FindControl调用(如果你需要多次调用,可以将它们放在NamingContainer中,参见{{3想知道怎么做。在你拥有用户控件的地方之后,你只需要做UserControl.HiddenField.Text来获取你正在寻找的标签。

这个最大的假设是,这些隐藏的字段都必须以一般的隔离方式处理 - 这是你的ForEach给我的印象,因为你似乎在处理每一个,但是彼此独立。如果所有这些事情都必须根据彼此的价值来处理,那么你最好不要使用Repeater建议。