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);
     }
 }
Example #3
0
        /// <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;
 }