private static List<ElementDescriptor> GetChildElements(this HtmlHelper html, IEnumerable actionResult, ActionContext targetActionContext, ActionContext actionContext, string propertyName, Func<object, bool> actionResultFilter) { List<ElementDescriptor> childElements; if (actionResult == null) { List<ElementDescriptor> paramElements = html.ActionParameterFields(targetActionContext).ToList(); childElements = html.GetActionDialog(targetActionContext, actionContext, paramElements, propertyName).InList(); } else { List<object> result = actionResult.Cast<object>().ToList(); if (result.Count() == 1 && actionResultFilter(result.First())) { childElements = html.GetSubEditObject(targetActionContext, actionContext, result.First(), propertyName).InList(); } else { childElements = html.SelectionView(actionContext.Target.GetDomainObject(), propertyName, actionResult).InList(); } } return childElements; }
internal static string GetActionAsForm(this HtmlHelper html, ActionContext actionContext, string controllerName, object routeValues, out string value, out RouteValueDictionary attributes) { const string tagType = "form"; IEnumerable<ElementDescriptor> concurrencyElements = html.GetConcurrencyElements(actionContext.Target, actionContext.GetConcurrencyActionInputId); string elements = concurrencyElements.Aggregate(String.Empty, (s, t) => s + t.BuildElement()); RouteValueDictionary routeValueDictionary; if (actionContext.ParameterValues != null && actionContext.ParameterValues.Any()) { // custom values have been set so push the values into view data // fields will be hidden and action will be 'none' so that action goes straight through and doesn't prompt for // parameters foreach (var pc in actionContext.GetParameterContexts(html.Facade())) { if (pc.CustomValue != null) { html.ViewData[html.IdHelper().GetParameterInputId((actionContext.Action), (pc.Parameter))] = pc.CustomValue.Specification.IsParseable ? pc.CustomValue.GetDomainObject() : pc.CustomValue; } } List<ElementDescriptor> paramElements = html.ActionParameterFields(actionContext).ToList(); elements = paramElements.Aggregate(String.Empty, (s, t) => s + t.BuildElement()); routeValueDictionary = new RouteValueDictionary(); } else { routeValueDictionary = new RouteValueDictionary(new { action = "action" }); } value = (elements + GetSubmitButton(null, actionContext.Action.Name, IdConstants.ActionInvokeAction, routeValueDictionary)).WrapInDivTag(); attributes = new RouteValueDictionary(new { action = html.GenerateUrl(Action(actionContext.Action.Id), controllerName, new RouteValueDictionary(routeValues)), method = "post", id = actionContext.GetActionId(), @class = actionContext.GetActionClass() }); return tagType; }
internal static IEnumerable<ElementDescriptor> ActionParameterFields(this HtmlHelper html, ActionContext actionContext, ActionContext targetActionContext, string propertyName, IEnumerable actionResult) { List<ElementDescriptor> childElements = html.GetChildElements(actionResult, targetActionContext, actionContext, propertyName, x => (html.Facade().GetObject(x).IsTransient && !html.Facade().GetObject(x).Specification.IsCollection)); return html.ActionParameterFields(actionContext, childElements, propertyName); }