ASP.NET Tutorial/Data Binding/ExpressionBuilders
RandomNumber Expression Builder
<source lang="csharp">
using System; using System.Web.UI; using System.Web.rupilation; using System.CodeDom; using System.ruponentModel; public class RandomNumberExpressionBuilder : ExpressionBuilder {
public static string GetRandomNumber(int lowerLimit, int upperLimit) { Random rand = new Random(); int randValue = rand.Next(lowerLimit, upperLimit + 1); return randValue.ToString(); } public override CodeExpression GetCodeExpression(BoundPropertyEntry entry, object parsedData,ExpressionBuilderContext context){ if (!entry.Expression.Contains(",")) { throw new ArgumentException("Must include two numbers separated by a comma."); } else { string[] numbers = entry.Expression.Split(","); if (numbers.Length != 2) { throw new ArgumentException("Only include two numbers."); } else { int lowerLimit, upperLimit; if (Int32.TryParse(numbers[0], out lowerLimit) && Int32.TryParse(numbers[1], out upperLimit)){ Type type = entry.DeclaringType; PropertyDescriptor descriptor = TypeDescriptor.GetProperties(type)[entry.PropertyInfo.Name]; CodeExpression[] expressionArray = new CodeExpression[2]; expressionArray[0] = new CodePrimitiveExpression(lowerLimit); expressionArray[1] = new CodePrimitiveExpression(upperLimit); return new CodeCastExpression(descriptor.PropertyType, new CodeMethodInvokeExpression(new CodeTypeReferenceExpression(base.GetType()), "GetRandomNumber", expressionArray)); } else { throw new ArgumentException("Use valid integers."); } } } }
} File: Web.config <?xml version="1.0"?> <configuration xmlns="http://schemas.microsoft.ru/.NetConfiguration/v2.0">
<appSettings/> <connectionStrings> <add name="Northwind" connectionString="Data Source=localhost;Initial Catalog=Northwind;Integrated Security=SSPI"/> </connectionStrings> <system.web> <compilation debug="true"> <expressionBuilders> <add expressionPrefix="RandomNumber" type="RandomNumberExpressionBuilder"/> </expressionBuilders> </compilation> <authentication mode="Windows"/> </system.web>
</configuration></source>