using System; using System.Linq; using System.Linq.Expressions; using System.Reflection; using System.Web.Mvc; using HtmlTags; using Microsoft.Web.Mvc; namespace InventoryTraker.Web.Helpers { public static class AngularHelperExtension { public static AngularHelper Angular(this HtmlHelper helper) { return new AngularHelper(helper); } } public class AngularHelper { private readonly HtmlHelper _htmlHelper; public AngularHelper(HtmlHelper helper) { _htmlHelper = helper; } public AngularModelHelper ModelFor(string expressionPrefix) { return new AngularModelHelper(_htmlHelper, expressionPrefix); } public HtmlTag FormForModel(string expressionPrefix) { var modelHelper = ModelFor(expressionPrefix); var formGroupForMethodGeneric = typeof(AngularModelHelper) .GetMethod("FormGroupFor"); var wrapperTag = new HtmlTag("div").NoTag(); foreach (var prop in typeof(TModel) .GetProperties(BindingFlags.Public | BindingFlags.Instance)) { if (prop.GetCustomAttributes().OfType().Any()) continue; var formGroupForProp = formGroupForMethodGeneric .MakeGenericMethod(prop.PropertyType); var propertyLambda = MakeLambda(prop); var formGroupTag = (HtmlTag)formGroupForProp.Invoke(modelHelper, new[] { propertyLambda }); wrapperTag.Append(formGroupTag); } return wrapperTag; } //Constructs a lambda of the form x => x.PropName private object MakeLambda(PropertyInfo prop) { var parameter = Expression.Parameter(typeof(TModel), "x"); var property = Expression.Property(parameter, prop); var funcType = typeof(Func<,>).MakeGenericType(typeof(TModel), prop.PropertyType); //x => x.PropName return Expression.Lambda(funcType, property, parameter); } public UIRatingTag UIRating(string model) { return new UIRatingTag(model); } public GridTag GridFor(Expression> targetAction) where TController : Controller { var dataUrl = _htmlHelper.BuildUrlFromExpression(targetAction); return new GridTag(dataUrl); } } }