internal string GetChangedAndOldValuesRendering(string prefix, HtmlHelper <TModel> htmlHelper) { StringBuilder sb = new StringBuilder(); sb.Append(BasicHtmlHelper.SafeHidden(htmlHelper, BasicHtmlHelper.AddField(prefix, "$.Item.Changed"), this.Item.Changed).ToString()); if (this.Item != null && this.Item.OldValue != null) { prefix = BasicHtmlHelper.AddField(prefix, "$.Item.OldValue"); if (fieldsToStore != null) { foreach (LambdaExpression l in fieldsToStore) { object val = null; string name = ExpressionHelper.GetExpressionText(l); try { val = l.Compile().DynamicInvoke(this.Item.OldValue); } catch { } if (val is IConvertible || val is Guid) { string res = BasicHtmlHelper.SafeHidden(htmlHelper, BasicHtmlHelper.AddField(prefix, name), val).ToString(); sb.Append(res); } else { MVCControlsToolkit.Controls.Bindings.ModelTranslatorLight model = new MVCControlsToolkit.Controls.Bindings.ModelTranslatorLight(); model.ImportFromModel(val); sb.Append(BasicHtmlHelper.RenderDisplayInfo(htmlHelper, typeof(MVCControlsToolkit.Controls.Bindings.ModelTranslatorLight), BasicHtmlHelper.AddField(prefix, name))); string res = BasicHtmlHelper.SafeHidden(htmlHelper, BasicHtmlHelper.AddField(prefix, name + ".$.JSonModel"), model.JSonModel).ToString(); sb.Append(res); } } } else { Stack <object> recursionControl = new Stack <object>(); recursionControl.Push(this.Item.OldValue); addObjectPropertiesTorender(prefix, htmlHelper, sb, propertiesToStore, this.Item.OldValue, recursionControl); recursionControl.Pop(); } } return(sb.ToString()); }
private void addObjectPropertiesTorender(string prefix, HtmlHelper <TModel> htmlHelper, StringBuilder sb, PropertyInfo[] propertiesToStore, object obj, Stack <object> recursionControl) { foreach (PropertyInfo pi in propertiesToStore) { if (pi.GetIndexParameters().GetLength(0) > 0) { continue; } object val = pi.GetValue(obj, new object[0]); if (val is IConvertible) { string res = BasicHtmlHelper.SafeHidden(htmlHelper, BasicHtmlHelper.AddField(prefix, pi.Name), val).ToString(); sb.Append(res); } else if (val is IEnumerable) { bool recursion = false; foreach (object ob in recursionControl) { if (object.ReferenceEquals(val, ob)) { recursion = true; } ; } if (recursion) { continue; } recursionControl.Push(val); addIEnumerablePropertiesTorender( BasicHtmlHelper.AddField(prefix, pi.Name), htmlHelper, sb, val as IEnumerable, recursionControl); recursionControl.Pop(); } else if (val != null) { bool recursion = false; foreach (object ob in recursionControl) { if (object.ReferenceEquals(val, ob)) { recursion = true; } } if (recursion) { continue; } recursionControl.Push(val); addObjectPropertiesTorender( BasicHtmlHelper.AddField(prefix, pi.Name), htmlHelper, sb, BasicHtmlHelper.GetPropertiesForInput(val.GetType()), val, recursionControl); recursionControl.Pop(); } } }
private void addIEnumerablePropertiesTorender( string prefix, HtmlHelper <TModel> htmlHelper, StringBuilder sb, IEnumerable en, Stack <object> recursionControl) { int i = 0; foreach (object obj in en) { if (obj == null) { i++; continue; } if (obj is IEnumerable) { bool recursion = false; foreach (object ob in recursionControl) { if (object.ReferenceEquals(obj, ob)) { recursion = true; } } if (recursion) { continue; } recursionControl.Push(obj); addIEnumerablePropertiesTorender( string.Format("{0}[{1}]", prefix, i), htmlHelper, sb, obj as IEnumerable, recursionControl); recursionControl.Pop(); } else if (obj is IConvertible) { string res = BasicHtmlHelper.SafeHidden(htmlHelper, string.Format("{0}[{1}]", prefix, i), obj).ToString(); sb.Append(res); i++; } else { bool recursion = false; foreach (object ob in recursionControl) { if (object.ReferenceEquals(obj, ob)) { recursion = true; } } if (recursion) { continue; } recursionControl.Push(obj); addObjectPropertiesTorender( string.Format("{0}[{1}]", prefix, i), htmlHelper, sb, BasicHtmlHelper.GetPropertiesForInput(obj.GetType()), obj, recursionControl); recursionControl.Pop(); } } }