Not a member of Pastebin yet?
                        Sign Up,
                        it unlocks many cool features!                    
                - using System.IO;
 - using System.Text;
 - using System.Collections.Generic;
 - using System.Linq.Expressions;
 - using HtmlAgilityPack;
 - namespace System.Web.Mvc.Html
 - {
 - public static class MvcExtensions
 - {
 - private static string EditorForManyInternal<TModel, TValue>(HtmlHelper<TModel> html, Expression<Func<TModel, IEnumerable<TValue>>> expression, IEnumerable<TValue> collection, string templateName)
 - {
 - var sb = new StringBuilder();
 - var prefix = html.ViewContext.ViewData.TemplateInfo.HtmlFieldPrefix;
 - var htmlFieldName = (prefix.Length > 0 ? (prefix + ".") : String.Empty) + ExpressionHelper.GetExpressionText(expression);
 - var items = collection ?? expression.Compile()(html.ViewData.Model);
 - foreach (var item in items)
 - {
 - var guid = Guid.NewGuid().ToString();
 - var dummy = new { Item = item };
 - var memberExp = Expression.MakeMemberAccess(Expression.Constant(dummy), dummy.GetType().GetProperty("Item"));
 - var singleItemExp = Expression.Lambda<Func<TModel, TValue>>(memberExp, expression.Parameters);
 - var editor = html.EditorFor(singleItemExp, templateName, string.Format("{0}[{1}]", htmlFieldName, guid));
 - var hidden = String.Format(@"<input type='hidden' name='{0}.Index' value='{1}' />", htmlFieldName, guid);
 - var eNode = HtmlNode.CreateNode(editor.ToHtmlString().Trim());
 - if (eNode is HtmlTextNode)
 - throw new InvalidOperationException("Unsuported element.");
 - if (eNode.GetAttributeValue("id", "") == "")
 - eNode.SetAttributeValue("id", guid);
 - var hNode = HtmlNode.CreateNode(hidden);
 - eNode.AppendChild(hNode);
 - sb.Append(eNode.OuterHtml);
 - }
 - return sb.ToString();
 - }
 - public static MvcHtmlString EditorForMany<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, IEnumerable<TValue>>> expression, string templateName)
 - {
 - var value = EditorForManyInternal(html, expression, null, templateName);
 - return new MvcHtmlString(value);
 - }
 - public static MvcHtmlString EditorForMany<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, IEnumerable<TValue>>> expression)
 - {
 - return EditorForMany(html, expression, null);
 - }
 - public static ContentResult EditorForSingle<TModel, TValue>(this Controller controller, Expression<Func<TModel, IEnumerable<TValue>>> expression, TValue model, string templateName)
 - {
 - if (model == null)
 - throw new ArgumentNullException("model");
 - var wfv = new WebFormView(controller.ControllerContext, "1");
 - var viewContext = new ViewContext(controller.ControllerContext, wfv, controller.ViewData, controller.TempData, TextWriter.Null);
 - var htmlHelper = new HtmlHelper<TModel>(viewContext, new ViewPage());
 - var value = EditorForManyInternal(htmlHelper, expression, new[] { model }, templateName);
 - return new ContentResult { Content = value };
 - }
 - public static ContentResult EditorForSingle<TModel, TValue>(this Controller controller, Expression<Func<TModel, IEnumerable<TValue>>> expression, TValue model)
 - {
 - return EditorForSingle(controller, expression, model, null);
 - }
 - public static ContentResult EditorForSingle<TModel, TValue>(this Controller controller, Expression<Func<TModel, IEnumerable<TValue>>> expression, string templateName)
 - where TValue : new()
 - {
 - return EditorForSingle(controller, expression, Activator.CreateInstance<TValue>(), templateName);
 - }
 - public static ContentResult EditorForSingle<TModel, TValue>(this Controller controller, Expression<Func<TModel, IEnumerable<TValue>>> expression)
 - where TValue : new()
 - {
 - return EditorForSingle(controller, expression, null);
 - }
 - }
 - }
 
Advertisement
 
                    Add Comment                
                
                        Please, Sign In to add comment