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