Shimmy

Untitled

Apr 16th, 2015
416
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 3.78 KB | None | 0 0
  1. using System.IO;
  2. using System.Text;
  3. using System.Collections.Generic;
  4. using System.Linq.Expressions;
  5. using HtmlAgilityPack;
  6.  
  7. namespace System.Web.Mvc.Html
  8. {
  9.   public static class MvcExtensions
  10.   {
  11.     private static string EditorForManyInternal<TModel, TValue>(HtmlHelper<TModel> html, Expression<Func<TModel, IEnumerable<TValue>>> expression, IEnumerable<TValue> collection, string templateName)
  12.     {
  13.       var sb = new StringBuilder();
  14.  
  15.       var prefix = html.ViewContext.ViewData.TemplateInfo.HtmlFieldPrefix;
  16.       var htmlFieldName = (prefix.Length > 0 ? (prefix + ".") : String.Empty) + ExpressionHelper.GetExpressionText(expression);
  17.  
  18.       var items = collection ?? expression.Compile()(html.ViewData.Model);
  19.       foreach (var item in items)
  20.       {
  21.         var guid = Guid.NewGuid().ToString();
  22.  
  23.         var dummy = new { Item = item };
  24.         var memberExp = Expression.MakeMemberAccess(Expression.Constant(dummy), dummy.GetType().GetProperty("Item"));
  25.         var singleItemExp = Expression.Lambda<Func<TModel, TValue>>(memberExp, expression.Parameters);
  26.  
  27.         var editor = html.EditorFor(singleItemExp, templateName, string.Format("{0}[{1}]", htmlFieldName, guid));
  28.         var hidden = String.Format(@"<input type='hidden' name='{0}.Index' value='{1}' />", htmlFieldName, guid);
  29.  
  30.         var eNode = HtmlNode.CreateNode(editor.ToHtmlString().Trim());
  31.         if (eNode is HtmlTextNode)
  32.           throw new InvalidOperationException("Unsuported element.");
  33.  
  34.         if (eNode.GetAttributeValue("id", "") == "")
  35.           eNode.SetAttributeValue("id", guid);
  36.  
  37.         var hNode = HtmlNode.CreateNode(hidden);
  38.         eNode.AppendChild(hNode);
  39.         sb.Append(eNode.OuterHtml);
  40.       }
  41.  
  42.       return sb.ToString();
  43.     }
  44.  
  45.     public static MvcHtmlString EditorForMany<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, IEnumerable<TValue>>> expression, string templateName)
  46.     {
  47.       var value = EditorForManyInternal(html, expression, null, templateName);
  48.       return new MvcHtmlString(value);
  49.     }
  50.  
  51.     public static MvcHtmlString EditorForMany<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, IEnumerable<TValue>>> expression)
  52.     {
  53.       return EditorForMany(html, expression, null);
  54.     }
  55.  
  56.     public static ContentResult EditorForSingle<TModel, TValue>(this Controller controller, Expression<Func<TModel, IEnumerable<TValue>>> expression, TValue model, string templateName)
  57.     {
  58.       if (model == null)
  59.         throw new ArgumentNullException("model");
  60.            
  61.       var wfv = new WebFormView(controller.ControllerContext, "1");
  62.       var viewContext = new ViewContext(controller.ControllerContext, wfv, controller.ViewData, controller.TempData, TextWriter.Null);
  63.       var htmlHelper = new HtmlHelper<TModel>(viewContext, new ViewPage());
  64.  
  65.       var value = EditorForManyInternal(htmlHelper, expression, new[] { model }, templateName);
  66.  
  67.       return new ContentResult { Content = value };
  68.     }
  69.     public static ContentResult EditorForSingle<TModel, TValue>(this Controller controller, Expression<Func<TModel, IEnumerable<TValue>>> expression, TValue model)
  70.     {
  71.       return EditorForSingle(controller, expression, model, null);
  72.     }
  73.     public static ContentResult EditorForSingle<TModel, TValue>(this Controller controller, Expression<Func<TModel, IEnumerable<TValue>>> expression, string templateName)
  74.       where TValue : new()
  75.     {
  76.       return EditorForSingle(controller, expression, Activator.CreateInstance<TValue>(), templateName);
  77.     }
  78.     public static ContentResult EditorForSingle<TModel, TValue>(this Controller controller, Expression<Func<TModel, IEnumerable<TValue>>> expression)
  79.       where TValue : new()
  80.     {
  81.       return EditorForSingle(controller, expression, null);
  82.     }
  83.   }
  84. }
Advertisement
Add Comment
Please, Sign In to add comment