2016-09-04 3 views
0

Meine Anwendungsschnittstelle bietet Eingang Endbenutzer-Markup zu erstellen, das, von dem ich ein Steuerelement mit Vorlagen bin mit für:ASP.NET, doppelte IDs und Templated Control ... Gibt es einen eleganteren Weg?

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

ich doppelte Kontrolle IDs in Web-Kontrollen innerhalb dieser Vorlagen ermöglichen muß. Jetzt weiß ich, dass ich nicht eine doppelte ID innerhalb einer einzigen Vorlage haben kann, aber ich kann dies tun:

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

Was ich will ist zu tun, anstatt die Vorlagen über Eigentum zu machen:

<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 

Ich möchte sie mithilfe eines benutzerdefinierten Klassentyps erstellen, der ITemplate implementiert. Allerdings, wenn ich dies tun, ich Fehler über doppelten IDs erhalten:

Hier ein Beispiel: https://msdn.microsoft.com/en-us/library/0e39s2ck.aspx

So kann ich Eigenschaften haben kann und sogar die Steuer Builder-Klasse außer Kraft setze in benutzerdefinierten Steuerelemente ohne hässlichen Markup zu ziehen.

Anstatt also diese:

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

ich das tun kann:

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

So letztlich mehr als alles, was dies alles über die doppelte Steuer-ID Problem zu lösen, und ich brauche, um das Ende Benutzer, um die Möglichkeit zu haben, diese ID zu setzen, so dass die IDs nicht in Frage kommen. Ich möchte diese in der Lage sein zu tun:

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

Also ... Ich muss innerhalb ihrer eigenen Instanz der Kontrolle doppelte IDs haben zu können, die ich keine andere Art und Weise kennen diese andere zu tun, als sie zu sein innerhalb einer Vorlage, aber ich möchte nicht TemplateA, TemplateB, etc. Ich muss in der Lage sein, Eigenschaften an diese Templates zu übergeben (Erzeuge sie als eine Klasse anstatt einer inneren Eigenschaft, bekomme aber immer noch doppelte ID-Fehler, wenn ich das tue diesen Weg).

Ich schrieb meine Beispiele in vb.net, aber C# Unterstützung ist willkommen mit einem Lächeln. Dies ist eine asp.net Frage im Allgemeinen. Jede Hilfe wird sehr geschätzt. Ich habe eine schwere Zeit damit.

Antwort

0

Try 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)) 
       })); 
      } 
     } 
    } 
} 
+0

scheiterte ich dies so entschuldigen antworten ich. Ich sehe nicht, wie dies funktionieren würde, wenn es dem Benutzer ermöglicht wird, das Steuerelement mit Vorlagen zu manipulieren und den Builder für die Analyse des Inhalts der Datei ascx zu verwenden. – user1447679

Verwandte Themen