protected virtual NormalWindow SetNormalWindowEntity(NormalWindow win, ModifiableEntity entity, ViewOptionsBase options, EntitySettings es, Control ctrl) { Type entityType = entity.GetType(); win.MainControl = ctrl; win.ShowOperations = options.ShowOperations; win.ViewMode = options.ViewButtons; entity = options.Clone ? (ModifiableEntity)((ICloneable)entity).Clone() : entity; win.OnPreEntityLoaded(entity); win.DataContext = entity; if (options.ReadOnly ?? OnIsReadOnly(entityType, entity)) { Common.SetIsReadOnly(win, true); } if (options is ViewOptions) { win.SaveProtected = ((ViewOptions)options).RequiresSaveOperation ?? (typeof(Entity).IsAssignableFrom(entityType) && EntityKindCache.RequiresSaveOperation(entityType)); //Matters even on Ok } TaskNormalWindow?.Invoke(win, entity); return(win); }
public override object?ReadJson(JsonReader reader, Type objectType, object?existingValue, JsonSerializer serializer) { using (HeavyProfiler.LogNoStackTrace("ReadJson", () => objectType.Name)) { if (reader.TokenType == JsonToken.Null) { return(null); } using (EntityCache ec = new EntityCache()) { reader.Assert(JsonToken.StartObject); ModifiableEntity mod = GetEntity(reader, objectType, existingValue, out bool markedAsModified); var pr = GetCurrentPropertyRoute(mod); var dic = PropertyConverter.GetPropertyConverters(mod.GetType()); using (JsonSerializerExtensions.SetAllowDirectMListChanges(markedAsModified)) while (reader.TokenType == JsonToken.PropertyName) { if ((string)reader.Value ! == "mixins") { var entity = (Entity)mod; reader.Read(); reader.Assert(JsonToken.StartObject); reader.Read(); while (reader.TokenType == JsonToken.PropertyName) { var mixin = entity[(string)reader.Value !];
internal List <FrameworkElement> GetToolbarButtons(ModifiableEntity entity, EntityButtonContext ctx) { List <FrameworkElement> elements = new List <FrameworkElement>(); if (GetButtonBarElementGlobal != null) { elements.AddRange(GetButtonBarElementGlobal.GetInvocationListTyped() .Select(d => d(entity, ctx)) .NotNull().SelectMany(d => d).NotNull().ToList()); } var getButtons = GetButtonBarElementByType.TryGetC(entity.GetType()); if (getButtons != null) { elements.AddRange(getButtons.GetInvocationListTyped() .Select(d => d(entity, ctx)) .NotNull().ToList()); } if (ctx.MainControl is IHaveToolBarElements) { elements.AddRange(((IHaveToolBarElements)ctx.MainControl).GetToolBarElements(entity, ctx)); } return(elements.OrderBy(Common.GetOrder).ToList()); }
protected internal virtual PartialViewResult PopupControl(ControllerBase controller, TypeContext typeContext, PopupOptionsBase popupOptions) { Type cleanType = typeContext.UntypedValue.GetType(); ModifiableEntity entity = (ModifiableEntity)typeContext.UntypedValue; AssertViewableEntitySettings(entity); controller.ViewData.Model = typeContext; controller.ViewData[ViewDataKeys.PartialViewName] = popupOptions.PartialViewName ?? Navigator.OnPartialViewName(entity); typeContext.ViewOverrides = Navigator.EntitySettings(entity.GetType()).GetViewOverrides(); bool isReadOnly = popupOptions.ReadOnly ?? Navigator.IsReadOnly(entity); if (isReadOnly) { typeContext.ReadOnly = true; } ViewMode mode = popupOptions.ViewMode; controller.ViewData[ViewDataKeys.ViewMode] = mode; controller.ViewData[ViewDataKeys.ShowOperations] = popupOptions.ShowOperations; if (mode == ViewMode.View) { controller.ViewData[ViewDataKeys.RequiresSaveOperation] = ((PopupViewOptions)popupOptions).RequiresSaveOperation ?? EntityKindCache.RequiresSaveOperation(entity.GetType()); } return(new PartialViewResult { ViewName = PopupControlView, ViewData = controller.ViewData, TempData = controller.TempData }); }
public IntegrityCheck(ModifiableEntity me, Dictionary <string, string> errors) { this.TemporalId = me.temporalId; this.Type = me.GetType(); this.Id = me is Entity e ? e.id : null; Errors = errors ?? throw new ArgumentNullException(nameof(errors)); }
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { if (reader.TokenType == JsonToken.Null) { return(null); } using (EntityCache ec = new EntityCache()) { reader.Assert(JsonToken.StartObject); ModifiableEntity mod = GetEntity(reader, objectType, existingValue, serializer, out bool markedAsModified); var pr = GetCurrentPropertyRoute(mod); var dic = PropertyConverter.GetPropertyConverters(mod.GetType()); while (reader.TokenType == JsonToken.PropertyName) { if ((string)reader.Value == "mixins") { var entity = (Entity)mod; reader.Read(); reader.Assert(JsonToken.StartObject); reader.Read(); while (reader.TokenType == JsonToken.PropertyName) { var mixin = entity[(string)reader.Value]; reader.Read(); using (JsonSerializerExtensions.SetCurrentPropertyRoute(pr.Add(mixin.GetType()))) serializer.DeserializeValue(reader, mixin.GetType(), mixin); reader.Read(); } reader.Assert(JsonToken.EndObject); reader.Read(); } else { PropertyConverter pc = dic.GetOrThrow((string)reader.Value); reader.Read(); ReadJsonProperty(reader, serializer, mod, pc, pr, markedAsModified); reader.Read(); } } reader.Assert(JsonToken.EndObject); AfterDeserilization.Invoke(mod); return(mod); } }
private bool ValidateModifiableEntity(ValidationContext validationContext, ModifiableEntity mod) { bool isValid = true; PropertyScope propertyScope = new PropertyScope(); validationContext.KeyBuilders.Push(propertyScope); var entity = mod as Entity; using (entity == null ? null : entity.Mixins.OfType <CorruptMixin>().Any(c => c.Corrupt) ? Corruption.AllowScope() : Corruption.DenyScope()) { foreach (var kvp in PropertyConverter.GetPropertyConverters(mod.GetType())) { if (kvp.Value.AvoidValidate) { continue; } propertyScope.PropertyName = kvp.Key; if (SignumValidate(validationContext, kvp.Value.GetValue(mod)) ?? true) { isValid = false; } string error = kvp.Value.PropertyValidator.PropertyCheck(mod); if (error != null) { string key = CalculateKey(validationContext); if (validationContext.ModelState.IsValidField(key)) { isValid = false; validationContext.ModelState.AddModelError(key, error); } } } } if (entity != null && entity.Mixins.Any()) { propertyScope.PropertyName = "mixins"; PropertyScope mixinScope = new PropertyScope(); validationContext.KeyBuilders.Push(mixinScope); foreach (var mixin in entity.Mixins) { mixinScope.PropertyName = mixin.GetType().Name; if (!ValidateModifiableEntity(validationContext, mixin)) { isValid = false; } } validationContext.KeyBuilders.Pop(); } validationContext.KeyBuilders.Pop(); return(isValid); }
private bool ValidateModifiableEntity(ModifiableEntity mod) { using (Validator.ModelBinderScope()) { bool isValid = true; var entity = mod as Entity; using (entity == null ? null : entity.Mixins.OfType <CorruptMixin>().Any(c => c.Corrupt) ? Corruption.AllowScope() : Corruption.DenyScope()) { foreach (var kvp in PropertyConverter.GetPropertyConverters(mod.GetType())) { if (kvp.Value.AvoidValidate) { continue; } string error = kvp.Value.PropertyValidator.PropertyCheck(mod); if (error != null) { isValid = false; ModelState.AddModelError(this.Key + "." + kvp.Key, error); } var val = kvp.Value.GetValue(mod); if (this.CurrentPath.Push(val)) { using (StateManager.Recurse(this, this.Key + "." + kvp.Key, null, val, null)) { if (this.SignumValidate() == false) { isValid = false; } } } } } if (entity != null && entity.Mixins.Any()) { foreach (var mixin in entity.Mixins) { if (this.CurrentPath.Push(mixin)) { using (StateManager.Recurse(this, "mixins[" + mixin.GetType().Name + "].element", null, mixin, null)) { isValid &= ValidateModifiableEntity(mixin); } } } } return(isValid); } }
public virtual (PropertyRoute pr, ModifiableEntity?mod) GetCurrentPropertyRoute(ModifiableEntity mod) { var tup = EntityJsonContext.CurrentPropertyRouteAndEntity; if (mod is IRootEntity re) { tup = (PropertyRoute.Root(mod.GetType()), mod); } if (tup == null) { var embedded = (EmbeddedEntity)mod; var route = GetCurrentPropertyRouteEmbedded(embedded); return(route, embedded); } else if (tup.Value.pr.Type.ElementType() == mod.GetType()) { tup = (tup.Value.pr.Add("Item"), null); //We have a custom MListConverter but not for other simple collections } return(tup.Value); }
public void ParseData(ModifiableEntity context, QueryDescription description, SubTokensOptions options) { try { token = QueryUtils.Parse(TokenString, description, options); } catch (Exception e) { parseException = new FormatException("{0} {1}: {2}\r\n{3}".FormatWith(context.GetType().Name, (context as Entity)?.IdOrNull, context, e.Message), e); } }
internal protected virtual EntitySettings AssertViewableEntitySettings(ModifiableEntity entity) { EntitySettings es = EntitySettings.TryGetC(entity.GetType()); if (es == null) { throw new InvalidOperationException("No EntitySettings for type {0}".FormatWith(entity.GetType().Name)); } if (!es.HasView()) { throw new InvalidOperationException("No view has been set in the EntitySettings for {0}".FormatWith(entity.GetType().Name)); } if (!IsViewableBase(entity.GetType(), entity)) { throw new InvalidOperationException("Entities of type {0} are not viewable".FormatWith(entity.GetType().Name)); } return(es); }
internal static MixinEntity?CreateMixins(ModifiableEntity mainEntity) { var types = GetMixinDeclarations(mainEntity.GetType()); MixinEntity?result = null; foreach (var t in types) { result = Constructors[t](mainEntity, result); } return(result); }
private bool ValidateModifiableEntity(ValidationContext validationContext, ModifiableEntity mod) { bool isValid = true; PropertyScope propertyScope = new PropertyScope(); validationContext.KeyBuilders.Push(propertyScope); var entity = mod as Entity; using (entity == null ? null : entity.Mixins.OfType<CorruptMixin>().Any(c => c.Corrupt) ? Corruption.AllowScope() : Corruption.DenyScope()) { foreach (var kvp in PropertyConverter.GetPropertyConverters(mod.GetType())) { if (kvp.Value.AvoidValidate) continue; propertyScope.PropertyName = kvp.Key; if (SignumValidate(validationContext, kvp.Value.GetValue(mod)) ?? true) { isValid = false; } string error = kvp.Value.PropertyValidator.PropertyCheck(mod); if (error != null) { string key = CalculateKey(validationContext); if (validationContext.ModelState.IsValidField(key)) { isValid = false; validationContext.ModelState.AddModelError(key, error); } } } } if (entity != null && entity.Mixins.Any()) { propertyScope.PropertyName = "mixins"; PropertyScope mixinScope = new PropertyScope(); validationContext.KeyBuilders.Push(mixinScope); foreach (var mixin in entity.Mixins) { mixinScope.PropertyName = mixin.GetType().Name; if (!ValidateModifiableEntity(validationContext, mixin)) isValid = false; } validationContext.KeyBuilders.Pop(); } validationContext.KeyBuilders.Pop(); return isValid; }
public static List <ToolBarButton> GetForEntity(EntityButtonContext ctx, ModifiableEntity entity) { List <ToolBarButton> links = new List <ToolBarButton>(); links.AddRange(globalButtons.SelectMany(a => a(ctx, entity) ?? Enumerable.Empty <ToolBarButton>()).NotNull()); List <Delegate> list = entityButtons.TryGetC(entity.GetType()); if (list != null) { links.AddRange(list.SelectMany(a => ((ToolBarButton[])a.DynamicInvoke(ctx, entity)) ?? Enumerable.Empty <ToolBarButton>()).NotNull()); } return(links.OrderBy(a => a.Order).ToList()); }
string GetTitle(ModifiableEntity mod) { if (mod == null) return ""; string niceName = mod.GetType().NiceName(); IdentifiableEntity ident = mod as IdentifiableEntity; if (ident == null) return niceName; if (ident.IsNew) { return LiteMessage.New.NiceToString().ForGenderAndNumber(ident.GetType().GetGender()) + " " + niceName; } return niceName + " " + ident.Id; }
public override Control CreateView(ModifiableEntity entity, PropertyRoute typeContext) { if (View == null) { throw new InvalidOperationException("View not defined in EntitySettings"); } if (typeContext == null && !(entity is IRootEntity)) { throw new ArgumentException("An EmbeddedEntity neeed TypeContext"); } Control control = View((T)entity); Common.SetPropertyRoute(control, typeContext ?? PropertyRoute.Root(entity.GetType())); return(control); }
public static string?DynamicValidation(ModifiableEntity mod, PropertyInfo pi) { if (!initialized) { return(null); } var candidates = DynamicValidations.Value.TryGetC(mod.GetType()).EmptyIfNull() .Where(pair => pair.Validation.Mixin <DisabledMixin>().IsDisabled == false) .ToList(); if (candidates.IsEmpty()) { return(null); } foreach (var pair in candidates) { if (pair.PropertyRoute.MatchesEntity(mod) == true) { var val = pair.Validation; using (HeavyProfiler.LogNoStackTrace("DynamicValidation", () => val.Name)) { try { string result = val.Eval.Algorithm.EvaluateUntyped(mod, pi); if (result != null) { return(result); } } catch (Exception e) { e.Data["DynamicValidation"] = val.Name; throw e; } } } } return(null); }
public static void PostConstructors_AddFilterProperties(ConstructorContext ctx, ModifiableEntity entity) { HttpContextBase httpContext = ctx.Controller.ControllerContext.HttpContext; if (!httpContext.Request.Params.AllKeys.Contains("webQueryName")) { return; } if (!(entity is Entity)) { return; } object queryName = Finder.ResolveQueryName(httpContext.Request.Params["webQueryName"]); if (entity.GetType() != queryName as Type) { return; } QueryDescription queryDescription = DynamicQueryManager.Current.QueryDescription(queryName); var filters = FindOptionsModelBinder.ExtractFilterOptions(httpContext, queryDescription) .Where(fo => fo.Operation == FilterOperation.EqualTo); var pairs = from pi in ctx.Type.GetProperties(BindingFlags.Public | BindingFlags.Instance) join fo in filters on pi.Name equals fo.Token.Key //where CanConvert(fo.Value, pi.PropertyType) && fo.Value != null where fo.Value != null select new { pi, fo }; foreach (var p in pairs) { p.pi.SetValue(entity, Common.Convert(p.fo.Value, p.pi.PropertyType), null); } return; }
public string GetTypeTitle(ModifiableEntity mod) { if (mod == null) { return(""); } string niceName = mod.GetType().NiceName(); Entity ident = mod as Entity; if (ident == null) { return(niceName); } if (ident.IsNew) { return(LiteMessage.New_G.NiceToString().ForGenderAndNumber(ident.GetType().GetGender()) + " " + niceName); } return(niceName + " " + ident.Id); }
void TaskSetIconNormalWindow(NormalWindow nw, ModifiableEntity entity) { var icon = GetEntityIcon(entity.GetType(), true); nw.Icon = icon; }
public static bool IsViewable(ModifiableEntity entity) { return(Manager.OnIsViewable(entity.GetType(), entity)); }
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { if (reader.TokenType == JsonToken.Null) { return(null); } using (EntityCache ec = new EntityCache()) { reader.Assert(JsonToken.StartObject); bool markedAsModified; ModifiableEntity mod = GetEntity(reader, objectType, existingValue, serializer, out markedAsModified); var pr = JsonSerializerExtensions.CurrentPropertyRoute; if (pr == null || mod is IRootEntity) { pr = PropertyRoute.Root(mod.GetType()); } else if (pr.Type.ElementType() == objectType) { pr = pr.Add("Item"); //Because we have a custom MListJsonConverter but not for other simpler collections } var dic = PropertyConverter.GetPropertyConverters(mod.GetType()); while (reader.TokenType == JsonToken.PropertyName) { if ((string)reader.Value == "mixins") { var entity = (Entity)mod; reader.Read(); reader.Assert(JsonToken.StartObject); reader.Read(); while (reader.TokenType == JsonToken.PropertyName) { var mixin = entity[(string)reader.Value]; reader.Read(); using (JsonSerializerExtensions.SetCurrentPropertyRoute(pr.Add(mixin.GetType()))) serializer.DeserializeValue(reader, mixin.GetType(), mixin); reader.Read(); } reader.Assert(JsonToken.EndObject); reader.Read(); } else { PropertyConverter pc = dic.GetOrThrow((string)reader.Value); reader.Read(); ReadJsonProperty(reader, serializer, mod, pc, pr, markedAsModified); reader.Read(); } } reader.Assert(JsonToken.EndObject); AfterDeserilization.Invoke(mod); return(mod); } }
public static string OnPartialViewName(ModifiableEntity entity) { return(EntitySettings(entity.GetType()).OnPartialViewName(entity)); }
public JsonNetResult Validate(string rootType = null, string propertyRoute = null) { ModifiableEntity mod = this.UntypedExtractEntity(); PropertyRoute route = (rootType.HasText() || propertyRoute.HasText()) ? PropertyRoute.Parse(TypeLogic.GetType(rootType), propertyRoute) : PropertyRoute.Root(mod.GetType()); MappingContext context = mod.UntypedApplyChanges(this, route: route).UntypedValidate(); IEntity ident = context.UntypedValue as IEntity; string newToStr = context.UntypedValue.ToString(); return(context.ToJsonModelState(newToStr)); }
static async void Manager_TaskNormalWindow(NormalWindow normal, ModifiableEntity entity) { ButtonBar bar = normal.Child<ButtonBar>(); var wrapPanel = (WrapPanel)bar.Content; bar.Content = null; HelpButton helpButton = new HelpButton { MainControl = normal, Margin = new Thickness(4), IsEnabled = false, }.Set(DockPanel.DockProperty, Dock.Right); bar.Content = new DockPanel { Children = { helpButton, wrapPanel } }; helpButton.IsActive = await Server.ReturnAsync((IHelpServer s) => s.HasEntityHelpService(entity.GetType())); helpButton.Checked += async (sender, args) => { var entityHelp = await Server.ReturnAsync((IHelpServer s) => s.GetEntityHelpService(entity.GetType())); SetHelpInfo(normal.Child<EntityTitle>(), entityHelp.Info); var properties = (from control in normal.Children<Control>(p => p.IsSet(Common.PropertyRouteProperty), HelpButton.WhereFlags) let propertyRoute = Common.GetPropertyRoute(control).SimplifyToPropertyOrRoot() where propertyRoute.PropertyRouteType != PropertyRouteType.Root select new { control, propertyRoute }).ToList(); var external = properties.Extract(t => t.propertyRoute.RootType != entity.GetType()); foreach (var t in properties) { SetHelpInfo(t.control, entityHelp.Properties.GetOrThrow(t.propertyRoute)); } var buttonBar = normal.Child<ButtonBar>(); var operations = (from control in buttonBar.Children<ToolBarButton>(p => p.Tag is OperationInfo, HelpButton.WhereFlags) select new { control, operation = ((OperationInfo)control.Tag).OperationSymbol }).ToList(); foreach (var t in operations) { SetHelpInfo(t.control, entityHelp.Operations.GetOrThrow(t.operation)); } var menuInfos = (from c in buttonBar.Children<ToolBarButton>(p => p.ContextMenu != null, HelpButton.WhereFlags) from mi in c.ContextMenu.Children<MenuItem>(p => p.Tag is OperationInfo, HelpButton.WhereFlags) select new { mi, operation = ((OperationInfo)mi.Tag).OperationSymbol }).ToList(); foreach (var t in menuInfos) { SetHelpInfo(t.mi, entityHelp.Operations.GetOrThrow(t.operation)); //ConstructFrom OperationInfo } if (external.Any()) { var externalRoutes = external.Select(a => a.propertyRoute).Distinct().ToList(); var dictionary = await Server.ReturnAsync((IHelpServer s) => s.GetPropertyRoutesService(externalRoutes)); foreach (var t in external) { SetHelpInfo(t.control, dictionary.GetOrThrow(t.propertyRoute)); } } }; helpButton.IsEnabled = true; }
protected virtual void SetParentEntity(ModifiableEntity p) { if (p != null && this.parentEntity != null && this.parentEntity != p) { throw new InvalidOperationException($"'{nameof(parentEntity)}' of '{this}'({this.GetType().TypeName()}) is still connected to '{parentEntity}'({parentEntity.GetType().TypeName()}), then can not be set to '{p}'({p.GetType().TypeName()})"); } this.parentEntity = p; }
public static bool IsViewable(ModifiableEntity entity, string partialViewName) { return(Manager.OnIsViewable(entity.GetType(), entity, partialViewName)); }
public static bool IsReadOnly(ModifiableEntity entity) { return(Manager.OnIsReadOnly(entity.GetType(), entity)); }
public static MappingContext UntypedApplyChanges(this ModifiableEntity entity, ControllerBase controller, string prefix = null, PropertyRoute route = null, SortedList <string, string> inputs = null) { return(miApplyChanges.GetInvoker(entity.GetType()).Invoke(entity, controller, prefix, route, inputs)); }
public override void WriteJson(JsonWriter writer, object?value, JsonSerializer serializer) { using (HeavyProfiler.LogNoStackTrace("WriteJson", () => value !.GetType().Name)) { PropertyRoute pr = GetCurrentPropertyRoute(value !); ModifiableEntity mod = (ModifiableEntity)value !; writer.WriteStartObject(); if (mod is Entity entity) { writer.WritePropertyName("Type"); writer.WriteValue(TypeLogic.TryGetCleanName(mod.GetType())); writer.WritePropertyName("id"); writer.WriteValue(entity.IdOrNull == null ? null : entity.Id.Object); if (entity.IsNew) { writer.WritePropertyName("isNew"); writer.WriteValue(true); } if (Schema.Current.Table(entity.GetType()).Ticks != null) { writer.WritePropertyName("ticks"); writer.WriteValue(entity.Ticks.ToString()); } } else { writer.WritePropertyName("Type"); writer.WriteValue(mod.GetType().Name); } if (!(mod is MixinEntity)) { writer.WritePropertyName("toStr"); writer.WriteValue(mod.ToString()); } writer.WritePropertyName("modified"); writer.WriteValue(mod.Modified == ModifiedState.Modified || mod.Modified == ModifiedState.SelfModified); foreach (var kvp in PropertyConverter.GetPropertyConverters(value !.GetType())) { WriteJsonProperty(writer, serializer, mod, kvp.Key, kvp.Value, pr); } if (mod.Mixins.Any()) { writer.WritePropertyName("mixins"); writer.WriteStartObject(); foreach (var m in mod.Mixins) { var prm = pr.Add(m.GetType()); using (JsonSerializerExtensions.SetCurrentPropertyRoute(prm)) { writer.WritePropertyName(m.GetType().Name); serializer.Serialize(writer, m); } } writer.WriteEndObject(); } writer.WriteEndObject(); } }
public static TypeContext UntypedNew(ModifiableEntity entity, string prefix, PropertyRoute route) { return((TypeContext)Activator.CreateInstance(typeof(TypeContext <>).MakeGenericType(entity.GetType()), entity, (TypeContext)null, prefix, route)); }
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { var pr = JsonSerializerExtensions.CurrentPropertyRoute; if (pr == null || typeof(IRootEntity).IsAssignableFrom(pr.Type)) { pr = PropertyRoute.Root(value.GetType()); } else if (pr.Type.ElementType() == value.GetType()) { pr = pr.Add("Item"); } ModifiableEntity mod = (ModifiableEntity)value; writer.WriteStartObject(); var entity = mod as Entity; if (entity != null) { writer.WritePropertyName("Type"); writer.WriteValue(TypeLogic.TryGetCleanName(mod.GetType())); writer.WritePropertyName("id"); writer.WriteValue(entity.IdOrNull == null ? null : entity.Id.Object); if (entity.IsNew) { writer.WritePropertyName("isNew"); writer.WriteValue(true); } if (Schema.Current.Table(entity.GetType()).Ticks != null) { writer.WritePropertyName("ticks"); writer.WriteValue(entity.Ticks.ToString()); } } else { writer.WritePropertyName("Type"); writer.WriteValue(mod.GetType().Name); } if (!(mod is MixinEntity)) { writer.WritePropertyName("toStr"); writer.WriteValue(mod.ToString()); } writer.WritePropertyName("modified"); writer.WriteValue(mod.Modified == ModifiedState.Modified || mod.Modified == ModifiedState.SelfModified); foreach (var kvp in PropertyConverter.GetPropertyConverters(value.GetType())) { WriteJsonProperty(writer, serializer, mod, kvp.Key, kvp.Value, pr); } if (entity != null && entity.Mixins.Any()) { writer.WritePropertyName("mixins"); writer.WriteStartObject(); foreach (var m in entity.Mixins) { var prm = pr.Add(m.GetType()); using (JsonSerializerExtensions.SetCurrentPropertyRoute(prm)) { writer.WritePropertyName(m.GetType().Name); serializer.Serialize(writer, m); } } writer.WriteEndObject(); } writer.WriteEndObject(); }
public static bool IsNavigable(ModifiableEntity entity, string partialViewName, bool isSearch = false) { return(Manager.OnIsNavigable(entity.GetType(), entity, partialViewName, isSearch)); }