Avatar billede runesoft Nybegynder
26. maj 2008 - 16:24 Der er 7 kommentarer og
1 løsning

lambda expressions i aspx koden

Hej.

Jeg sidder og laver et lille web framework. Jeg har brug for at kunne definere lambda expressions helt ude i aspx koden. Hvordan gør jeg det? Det er i forbindelse med nogle usercontrols jeg selv har implementeret.

-Rune
Avatar billede driis Nybegynder
26. maj 2008 - 17:11 #1
Præcis som du gør det i C# koden.

Dog skal du sørge for at websitet er indstillet til at Target Framework = 3.5. Det sikrer at den rigtige C#3.0 compiler anvendes, når din .aspx compiles.
Avatar billede driis Nybegynder
26. maj 2008 - 17:12 #2
I praksis er det denne bid i web.config, der får ASP .NET til at bruge 3.0 compileren. Derudover skal du sørge for at den refererer de rigtige nye assemblies, hvis du f.eks. bruger extension metoder.

<system.codedom>
        <compilers>
            <compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CSharp.CSharpCodeProvider,System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" warningLevel="4">
                <providerOption name="CompilerVersion" value="v3.5"/>
                <providerOption name="WarnAsError" value="false"/>
            </compiler>
        </compilers>
    </system.codedom>
Avatar billede runesoft Nybegynder
27. maj 2008 - 22:12 #3
jeg har defineret min lambda på min userControl:
public Func<object, string> func;

og i min aspx kode har jeg:
<my:MyBoundField func="x =&gt; x.ToString()"  />

jeg får følgende fejl...  hvda gør jeg galt?
Parser Error Message: Cannot create an object of type 'System.Func`2[[System.Object, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]' from its string representation 'x => x.ToString()' for the 'func' property.
Avatar billede driis Nybegynder
27. maj 2008 - 22:42 #4
Du er nødt til at lave det som en databinding expression
<my:MyBoundField func="<%# x => x.ToString() %>" />

Og så selvfølgelig sikre, at DataBind kaldes.
Avatar billede runesoft Nybegynder
28. maj 2008 - 18:11 #5
hmm....  Det er rent faktisk en klasse der nedarver fra BoundField som ikke har en Databind. Er der nogen måde jeg kan få det ind alligevel?
Avatar billede driis Nybegynder
28. maj 2008 - 21:56 #6
Jeg tror det kan lade sig gøre, hvis du selv skriver en TypeConverter til at lave konversionen. Jeg har dog ikke prøvet det - og det vil sikkert være lidt besværligt at gå fra streng repræsentationen til den delegate instans, du har brug for.
Avatar billede runesoft Nybegynder
28. maj 2008 - 22:08 #7
øv da...  nå men tak. Det har været en stor hjælp.
Avatar billede driis Nybegynder
29. maj 2008 - 09:07 #8
BoundField har en protected virtual metode ved navn GetValue, som er ansvarlig for at få fat på det objekt, der skal vises. Den kan du evt. override, hvis du har en måde at få fat på delegaten på. Her er et eksempel (som dog ikke har noget med delegates at gøre), fra noget gammelt kode jeg har liggende:

/// <summary>
        /// Retrieves the value of the field bound to the <see cref="T:System.Web.UI.WebControls.BoundField"></see> object.
        /// </summary>
        /// <param name="controlContainer">The container for the field value.</param>
        /// <returns>
        /// The value of the field bound to the <see cref="T:System.Web.UI.WebControls.BoundField"></see>.
        /// </returns>
        /// <exception cref="T:System.Web.HttpException">The container specified by the controlContainer parameter is null.- or - The container specified by the controlContainer parameter does not have a data item.- or - The data field was not found. </exception>
        protected override object GetValue(Control controlContainer)
        {
            object o = DataBinder.GetDataItem(controlContainer);
            if (o != null)
            {
                object value = ReflectionFactory.EvaluateBindExpression(o, DataField);
                if (value != null)
                    return FormatterObject.FormatString(value);
                else if (o is IListingElement)
                    return FormatterObject.FormatString(((IListingElement)o)[DataField]);
                else
                    return null;
            }
            throw new ApplicationException("No data item defined for the control container");
        }
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester