using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Linq.Expressions; using Extensions; using Et; namespace Et { class Program { static void Main(string[] args) { var p = new Person(); Console.WriteLine("Extension method:"); ((HtmlHelper<Person>)null).TextBoxFor(x => x.Lastname); ((HtmlHelper<Person>)null).TextBoxFor(x => x.Age); Console.WriteLine("\nNon-extension method:"); InputFor<Person, string>(x => x.Lastname); InputFor<Person, int>(x => x.Age); Console.ReadLine(); } public static void InputFor<T, TProp>(Expression<Func<T, TProp>> s) { Console.WriteLine(s.Body.ToString()); Console.WriteLine(((MemberExpression)s.Body).Member.Name); } } public class Person { public string Lastname { get; set; } public int Age { get; set; } } public class HtmlHelper<T> { } } namespace Extensions { public static class Helpers { public static void TextBoxFor<T,TProp>(this HtmlHelper<T> sx, Expression<Func<T, TProp>> s) { Console.WriteLine(s.Body.ToString()); Console.WriteLine(((MemberExpression)s.Body).Member.Name); } } }
Output:
Extension method: x.Lastname Lastname x.Age Age Non-extension method: x.Lastname Lastname x.Age Age
I'll use this proof-of-concept to make an HtmlHelper for jQuery AJAX ComboBox tomorrow
[UPDATE: March 24, 2011]
Good thing ASP.NET MVC is opensource, I was able to find the more robust way to generate an ID from strongly-typed model. The function resides in ExpressionHelper class, the function is GetExpressionText, which accepts a LambdaExpression.
So this:
namespace JqueryAjaxComboBoxHelper { public static class InputExtensions { public static MvcHtmlString ComboBoxFor<TModel, TProperty> (this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression) { // string fieldName = ((MemberExpression)expression.Body).Member.Name; string fieldName = ExpressionHelper.GetExpressionText(expression); var tagBuilder = new TagBuilder("div"); tagBuilder.MergeAttribute("id", fieldName); tagBuilder.MergeAttribute("class", "ac_area"); return new MvcHtmlString(tagBuilder.ToString()); } } }
And this:
Html.AjaxComboBoxFor(model => model.Address.City);
That will generate this:
<div class="ac_area" id="Address.City">
Whereas my proof-of-concept code (string fieldName = ((MemberExpression)expression.Body).Member.Name;) can only obtain City:
<div class="ac_area" id="City">
No comments:
Post a Comment