ASP.NET,重复ID和模板控制...有更优雅的方式吗?

时间:2016-09-04 23:40:05

标签: c# asp.net vb.net custom-controls

我的应用程序界面提供最终用户输入以创建标记,我使用模板化控件进行标记:

<me:MyControl>
  <TemplateA>
    I'm inside of an ITemplate
  </TemplateA>
  <TemplateB>
    So what, I am too. 
  </TemplateB>          
</me:MyControl>

我需要在这些模板内的Web控件中允许重复的控件ID。现在我知道我在单个模板中没有重复的ID,但我可以这样做:

<me:MyControl>
  <TemplateA>
    <me:Textbox Id="ABC" />
  </TemplateA>
  <TemplateB>
    <me:Textbox Id="ABC" />
  </TemplateB>          
</me:MyControl>

我想做的不是通过属性制作模板:

<TemplateContainer(GetType(HelloWorld))>
<PersistenceMode(PersistenceMode.InnerProperty)>
Public Property TemplateA() As ITemplate

Protected Overrides Sub CreateChildControls()

  If TemplateA IsNot Nothing Then TemplateA.InstantiateIn(Me)
  If TemplateB IsNot Nothing Then TemplateB.InstantiateIn(Me)
  MyBase.CreateChildControls()

End Sub

我想通过使用Implements ITemplate的自定义类类型来创建它们。但是,当我这样做时,我收到有关重复ID的错误:

以下是一个例子:https://msdn.microsoft.com/en-us/library/0e39s2ck.aspx

这样我就可以拥有属性甚至覆盖控件构建器类来引入自定义控件而不会出现难看的标记。

所以不要这样:

<me:MyControl>
  <TemplateA>
    <me:BaseControl Hello="World" Foo="Bar">
      More controls inside
    </me:BaseControl>
  </TemplateA>
</me:MyControl>

我可以这样做:

<me:MyControl>
  <TemplateA Hello="World" Foo="Bar">
    More controls inside        
  </TemplateA>
</me:MyControl>

所以最终,最重要的是解决重复的控件ID问题,我需要最终用户能够设置此ID,因此遗漏ID是不可能的。我希望能够做到这一点:

<me:MyControl>
  <TemplateA PropertyA="Hello" PropertyB="World">
    <asp:Textbox Id="Test" />        
  </TemplateA>
  <TemplateA PropertyA="Foo" PropertyB="Bar">
    <asp:Textbox Id="Test" />        
  </TemplateA>
</me:MyControl>

所以,我需要能够在他们自己的控件实例中有重复的ID,除了他们在模板中之外,我知道没有别的方法可以做到这一点,但我不想要templateA, templateB等我需要能够将属性传递给这些模板(将它们构建为类而不是内部属性,但是当我这样做时仍然会出现重复的ID错误。)

我在vb.net中编写了我的示例,但欢迎C#支持。这是一个asp.net问题。

1 个答案:

答案 0 :(得分:0)

试试xml linq

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string xmlHeader = "<?xml version=\"1.0\" encoding=\"utf-8\" ?>" +
                "<Root xmlns:me =\"abc\" xmlns:asp =\"def\"></Root>";
            XDocument doc = XDocument.Parse(xmlHeader);
            XElement root = (XElement)doc.FirstNode;
            XNamespace meNs = root.GetNamespaceOfPrefix("me");
            XNamespace aspNs = root.GetNamespaceOfPrefix("asp");

            XElement control = new XElement(meNs + "MyControl");
            root.Add(control);

            var inputs = new[] {
               new { PropertyA="Hello", PropertyB="World", Id="Test"},
               new { PropertyA="Foo", PropertyB="Bar", Id="Test"},
            };

            foreach (var input in inputs)
            {
                control.Add(new XElement("TemplateA", new object[] {
                    new XAttribute("PropertyA", input.PropertyA),
                    new XAttribute("PropertyB", input.PropertyB),
                    new XElement(aspNs + "Textbox", new XAttribute("Id", input.Id))
                 }));
            }
        }
    }
}