private static object Deserialize(JsonSerializer serializer, JToken jtoken, ViewModelPropertyMap property, object existingValue) { if (property.JsonConverter != null && property.JsonConverter.CanRead && property.JsonConverter.CanConvert(property.Type)) { return(property.JsonConverter.ReadJson(jtoken.CreateReader(), property.Type, existingValue, serializer)); } else { if (existingValue != null && property.Populate) { if (jtoken.Type == JTokenType.Null) { return(null); } else if (jtoken.Type == JTokenType.Object) { serializer.Converters.OfType <ViewModelJsonConverter>().First().Populate((JObject)jtoken, serializer, existingValue); return(existingValue); } else { serializer.Populate(jtoken.CreateReader(), existingValue); return(existingValue); } } else { return(serializer.Deserialize(jtoken.CreateReader(), property.Type)); } } }
private static void Serialize(JsonSerializer serializer, JsonWriter writer, ViewModelPropertyMap property, object value) { if (property.JsonConverter != null && property.JsonConverter.CanWrite && property.JsonConverter.CanConvert(property.Type)) { property.JsonConverter.WriteJson(writer, value, serializer); } else { serializer.Serialize(writer, value); } }
/// <summary> /// Gets the properties of the specified type. /// </summary> private IEnumerable <ViewModelPropertyMap> GetProperties(Type type) { foreach (var property in type.GetProperties(BindingFlags.Public | BindingFlags.Instance).OrderBy(p => p.Name)) { if (property.GetCustomAttribute <JsonIgnoreAttribute>() != null) { continue; } var propertyMap = new ViewModelPropertyMap() { PropertyInfo = property, Name = property.Name, ViewModelProtection = ViewModelProtectionSettings.None, Type = property.PropertyType, TransferAfterPostback = property.GetMethod != null, TransferFirstRequest = property.GetMethod != null, TransferToServer = property.SetMethod != null, JsonConverter = GetJsonConverter(property), Populate = ViewModelJsonConverter.IsComplexType(property.PropertyType) && !ViewModelJsonConverter.IsEnumerable(property.PropertyType) }; var bindAttribute = property.GetCustomAttribute <BindAttribute>(); if (bindAttribute != null) { propertyMap.TransferAfterPostback = bindAttribute.Direction.HasFlag(Direction.ServerToClientPostback); propertyMap.TransferFirstRequest = bindAttribute.Direction.HasFlag(Direction.ServerToClientFirstRequest); propertyMap.TransferToServer = bindAttribute.Direction.HasFlag(Direction.ClientToServerNotInPostbackPath) || bindAttribute.Direction.HasFlag(Direction.ClientToServerInPostbackPath); propertyMap.TransferToServerOnlyInPath = !bindAttribute.Direction.HasFlag(Direction.ClientToServerNotInPostbackPath) && propertyMap.TransferToServer; } var viewModelProtectionAttribute = property.GetCustomAttribute <ViewModelProtectionAttribute>(); if (viewModelProtectionAttribute != null) { propertyMap.ViewModelProtection = viewModelProtectionAttribute.Settings; } var validationAttributes = validationMetadataProvider.GetAttributesForProperty(property); propertyMap.ValidationRules = validationRuleTranslator.TranslateValidationRules(property, validationAttributes).ToList(); yield return(propertyMap); } }
public virtual void SetOptions(ViewModelPropertyMap map) { map.TransferAfterPostback = map.TransferToServer = map.TransferToServerOnlyInPath = false; }