26. maj 2008 - 16:24Der 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.
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.
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.
jeg har defineret min lambda på min userControl: public Func<object, string> func;
og i min aspx kode har jeg: <my:MyBoundField func="x => 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.
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.
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"); }
Synes godt om
Ny brugerNybegynder
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.