Toon posts:

[C#]Custom Web Control - Attribute Namespace

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hi All,

Ik heb een custom webcontroltje gemaakt in C#. Als voorbeeld heb ik heel simpel een TextBox controltje gepakt en daar wat extra properties aan gegeven.
Dus:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class TextBox : System.Web.UI.WebControls.TextBox
{
...
        protected string _myString = string.Empty;      
        public string myprop
        {
            get{ 
                return _myString;  
            }
            set{ 
                this._myString = value;  
            }
        }
}

Nu heb ik dit controltje in mijn webform gezet:
code:
1
2
3
4
5
<%@ Register TagPrefix="x" Namespace="SomeName.Library" Assembly="MyTextContyrol" %>
...
<form id="Form1" method="post" runat="server">
   <x:TextBox id="TextBox1" runat="server" myprop="my string here" ></x:TextBox>
</form>

Dit werkt allemaal perfect uiteraard, maar nu wil ik graag een prefix geven aan het "myprop" attribute.
Dus zoiets:
code:
1
2
// ... xmlns:x="http://mysite/myschema"
<x:TextBox id="TextBox1" runat="server" x:myprop="my string here" ></x:TextBox>

Nu kan je dus niet even in je code een property maken met een prefix ervoor...duh 8)7 dit mag ook helemaal niet. Maar hoe moet ik dit probleem oplossen. Ik heb werkelijk geen idee. Ik vraag me sowiezo af OF het wel mogelijk is. Ik kan er niets over vinden in ieder geval. Hopelijk hebben jullie een idee.

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 19:40

gorgi_19

Kruimeltjes zijn weer op :9

Waarom wil je een prefix geven aan myprop? :?

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Verwijderd

Topicstarter
Nou dan kan ik dezelfde naam gebruiken. Dus ik heb dan een attribute myprop en een attribute x:myprop. Ik weet dat er andere betere en mooiere oplossingen zijn !!! :*)

Verwijderd

Topicstarter
Ik was vergeten te vertellen dat je de attributen natuurlijk met:
code:
1
this.Attributes["x:myprop"]

kunt ophalen. :)

Maar door het gebruik van x:myprop in de custum control tag levert dit na compilatie een parse error op.
"The server tag is not well formed." Dus hoe moet ik dit oplossen??

[ Voor 10% gewijzigd door Verwijderd op 15-11-2004 10:08 ]


Verwijderd

Topicstarter
Al het hele weekend heb ik slapeloze nachten :'( , omdat ik helemaal vast zit hiermee. Zelfs op Microsoft forums weten ze me geen richtlijnen etc. te kunnen geven. Ik hoop echt dat jullie mij iets meer kunnen vertellen. :*)

Verwijderd

een attribute is altijd in de vorm van Name=Value oftwel een IDictionary collectie als ik het juist heb, wat je probeert gaat niet werken denk ik, tenzij je een soort custom parser schrijft hiervoor, maar waarom gebruik je niet gewoon een andere naam dan de TextBox die al heeft, en kan je die property anders niet gewoon overriden in je control?

Verwijderd

Je prefix x is een verkorte schrijfwijze voor het specificeren van de namespace "http://mysite/myschema" die je eerder in je XML document hebt gekozen. Als je in de tag TextBox specificeert dat deze hoort bij die namespace, dan hoef je dat niet bij de attribute nogmaals te doen.

Verwijderd

Verwijderd schreef op maandag 15 november 2004 @ 10:46:
Je prefix x is een verkorte schrijfwijze voor het specificeren van de namespace "http://mysite/myschema" die je eerder in je XML document hebt gekozen. Als je in de tag TextBox specificeert dat deze hoort bij die namespace, dan hoef je dat niet bij de attribute nogmaals te doen.
hij wilt een tweede attribute, omdat zijn TextBox die hij inherit al de property MyProp heeft, en hij wilt zelf ook nog een MyProp aanmaken specifiek voor zijn eigen class. Vandaar de prefix :) (denk ik ten minste)

Verwijderd

Verwijderd schreef op maandag 15 november 2004 @ 11:24:
[...]

hij wilt een tweede attribute, omdat zijn TextBox die hij inherit al de property MyProp heeft, en hij wilt zelf ook nog een MyProp aanmaken specifiek voor zijn eigen class. Vandaar de prefix :) (denk ik ten minste)
Het kan zijn dat ik er lelijk naast zit hoor, of dat de fout heel ergens anders vandaan komt, maar om het even ongenuanceerd op te schrijven:

Hij kan van alles willen, maar het moet wel betekenis hebben. In een XML document gaat het niet zozeer om de tekst die er staat, maar om het model dat de XML parser hieruit afleest. Een goede XML parser negeert een overbodige specificatie van een namespace en werkt verder alsof hij er niet stond, omdat de specificatie geen andere betekenis heeft dan het vaststellen van een namespace die reeds vastgesteld was.

Ik zou zeggen: kies een andere naam of verzin een andere oplossing; het toevoegen van een x: voor je myprop gaat niet werken.

Verwijderd

Verwijderd schreef op maandag 15 november 2004 @ 12:57:
[...]


Het kan zijn dat ik er lelijk naast zit hoor, of dat de fout heel ergens anders vandaan komt, maar om het even ongenuanceerd op te schrijven:

Hij kan van alles willen, maar het moet wel betekenis hebben. In een XML document gaat het niet zozeer om de tekst die er staat, maar om het model dat de XML parser hieruit afleest. Een goede XML parser negeert een overbodige specificatie van een namespace en werkt verder alsof hij er niet stond, omdat de specificatie geen andere betekenis heeft dan het vaststellen van een namespace die reeds vastgesteld was.

Ik zou zeggen: kies een andere naam of verzin een andere oplossing; het toevoegen van een x: voor je myprop gaat niet werken.
waar zie jij een XML parser dan? Dit is gewoon een control hoor. En die accepteert alleen attributes in de vorm van key=value, en daar ligt zijn probleem.

Verwijderd

Verwijderd schreef op maandag 15 november 2004 @ 13:22:
[...]

waar zie jij een XML parser dan? Dit is gewoon een control hoor. En die accepteert alleen attributes in de vorm van key=value, en daar ligt zijn probleem.
En deze control leest de XML in zonder XML parser? :?
Verwijderd schreef op vrijdag 12 november 2004 @ 15:23:
Maar door het gebruik van x:myprop in de custum control tag levert dit na compilatie een parse error op.
"The server tag is not well formed." Dus hoe moet ik dit oplossen??
Zonder de x: werkte het wel, dus lijkt mij duidelijk verhaal.

[ Voor 35% gewijzigd door Verwijderd op 15-11-2004 13:46 ]


Verwijderd

waar wordt er XML gelezen dan? Misschien dat ik dat stukje mis maar ok, zonder de x: heeft hij twee keer dezelfde property. Oftewel andere property name en klaar.

Verwijderd

Achter de schermen. Als je key-value pairs specificeert als attributen van een XML tag in een XML file, en het component kan daarna beschikken over de waarden van die attributen, dan kan dat alleen als het XML document gelezen is. Of het component moet helderziend zijn. Of heb ik nu last van het maandagmorgenvirus?

Verwijderd

Topicstarter
Really trust me, I know what I'm doing.
Waar het om gaat is dat ik die namespace prefix echt nodig heb. Om een extreem voorbeeld te noemen. Ik wil door een app code genereren, deze door XSLT laten transformeren en weer processen. Etc. Snap je het nog? 8)7 ik heb die namespace nodig, maar ik heb dus geen idee hoe dit op te lossen. Moet ik dan toch een wrapper schrijven? Dit kost weer performance etc. Microsoft heeft zich met zijn ASP.NET niet echt aan de W3C standaard gehouden. pffff :(

Verwijderd

Verwijderd schreef op maandag 15 november 2004 @ 17:03:
Really trust me, I know what I'm doing.
Waar het om gaat is dat ik die namespace prefix echt nodig heb. Om een extreem voorbeeld te noemen. Ik wil door een app code genereren, deze door XSLT laten transformeren en weer processen. Etc. Snap je het nog? 8)7 ik heb die namespace nodig, maar ik heb dus geen idee hoe dit op te lossen. Moet ik dan toch een wrapper schrijven? Dit kost weer performance etc. Microsoft heeft zich met zijn ASP.NET niet echt aan de W3C standaard gehouden. pffff :(
Als je XSLT wilt gebruiken, lijkt mij reden te meer om netjes om te gaan met namespaces en bijbehorende prefixes. Kun je uitleggen op welk punt Microsoft zich niet aan de W3C standaard houdt? Ik heb namelijk meer het idee dat jij je er niet aan houdt. :)

Tip: denk pas aan performance als je performanceproblemen krijgt. Zolang je looptijd lineair blijft, valt het vaak reuze mee.

[ Voor 8% gewijzigd door Verwijderd op 15-11-2004 17:13 ]


Verwijderd

Topicstarter
Ik noem maar eens dat je de runat="server" ook zo mag schrijven: runat=server. Niet echt W3C ;)

Maar ik vind dit een erg interessante discussie wat in .Net wel of niet W3C is, maar dat is niet mijn hoofd onderwerp. De vraag is of je nu wel of niet een attribuut kan prefixen. Zo ja hoe dit op te lossen en zo nee, waarom niet....

[ Voor 7% gewijzigd door Verwijderd op 15-11-2004 17:30 ]


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 19:40

gorgi_19

Kruimeltjes zijn weer op :9

W3C heeft er niets mee te maken. C++ is ook niet W3C.

En nee, het is niet te prefixen. De reden? De interne parser kijkt er op deze manier na. Een oplossing: schrijf een eigen httphandlerfactory, welke de door jouw gewenste correcties op pagehandlerfactory uitvoert.

[ Voor 6% gewijzigd door gorgi_19 op 15-11-2004 17:34 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Verwijderd

Ik zeg: Je kunt wel prefixen, maar het voegt niets toe zolang het attribuut binnen een context staat van een element uit dezelfde namespace.

XML:
1
<x:TextBox id="TextBox1" runat="server" x:myprop="my string here" ></x:TextBox>


Is volkomen equivalent aan

XML:
1
<x:TextBox id="TextBox1" runat="server" myprop="my string here" />


En daarom kun je het net zo goed niet doen.

Het antwoord op je vraag komt ongeveer neer op "nee, het kan niet". Hoe het wel moet, geen idee, ik weet niets over web controls. Dat is ook de reden dat ik overal enige voorzichtigheid betract in mijn uitspraken. Ik ken wel genoeg XML om te kunnen stellen dat datgene wat je wilt in XML geen betekenis heeft.

Verwijderd

misschien een rare vraag, maar waarom override je de property van de textbox niet? en wat is het 'grote' probleem met een andere property name? of ga je meer in de trend van x:prop y:prop z:prop ?

Verwijderd

Of nog liever: xProp yProp zProp, dus zonder aparte namespaces en dan met beschrijvende namen....

Verwijderd

Topicstarter
Ik denk dat een httphandlerfactory de beste oplossing in dit geval is. _/-\o_ Ik moet nog even goed uitzoeken wat de mogelijkheden zijn, maar ik denk dat dit de enige oplossing is.

Verwijderd

Topicstarter
Okey almost there...
Wat ik nu heb gedaan is een klasse gemaakt die overerft van IHttpHandlerFactory Met daarin:
C#:
1
2
3
4
5
6
7
8
        public virtual IHttpHandler GetHandler(HttpContext context, 
                String requestType, String url, String pathTranslated)
        {
        }
        public virtual void ReleaseHandler(IHttpHandler handler)
        {
            return;
        }


Welnu, ik kan in "GetHandler" met bijvoorbeeld een StreamReader de source code van de aspx pagina ophalen.
'At runtime' kan ik ASPX pagina's compilen met "PageParser.GetCompiledPageInstance", maar deze methode vereist een pad naar de source code(de code die ik net dus heb opgehaald en gewijzigd). Ik wil niet de gewijzigde code terug schrijven naar de disk(vanwege performence etc.)
Enige idee hoe ik dit kan oplossen zonder vreselijke performence hits)? B)

[ Voor 4% gewijzigd door Verwijderd op 19-11-2004 11:00 ]

Pagina: 1