Exemplo n.º 1
0
        /// <summary>
        /// This class is responsible for getting the current iterate item object within an iteration. i.e. The property name starts with "[]."
        /// We do this by navigating up through the parent nodes to determine which of them are iterate elements.
        /// Once found we get the current iteration context item.
        /// If "[]." is not specified, the original approach is used of reflecting the parameterObject to the reflection path specified in the property
        /// </summary>
        /// <param name="ctx"></param>
        /// <param name="baseTag"></param>
        /// <param name="parameterObject"></param>
        /// <returns></returns>
        /// <remarks>
        /// Created By: Richard Beacroft
        /// Created Date: 11\10\2013
        /// </remarks>
        protected object GetMemberPropertyValue(SqlTagContext ctx, BaseTag baseTag, object parameterObject)
        {
            if (String.IsNullOrEmpty(baseTag.Property))
            {
                return(parameterObject);
            }
#if dotnet35
            var bindingReplacement = ctx.BuildPropertyBindingReplacements(baseTag).FirstOrDefault();
#else
            BindingReplacement bindingReplacement = null;
            foreach (var replacement in ctx.BuildPropertyBindingReplacements(baseTag))
            {
                bindingReplacement = replacement;
                break;
            }
#endif
            if (bindingReplacement != null)
            {
                if (String.IsNullOrEmpty(bindingReplacement.FullPropertyName))
                {
                    return(bindingReplacement.Value);
                }
                return(_tagPropertyProbe.GetMemberValue(ctx, baseTag, bindingReplacement.FullPropertyName, parameterObject));
            }

            return(_tagPropertyProbe.GetMemberPropertyValue(ctx, baseTag, parameterObject));
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="ctx"></param>
        /// <param name="tag"></param>
        /// <param name="parameterObject"></param>
        /// <returns></returns>
        /// Updated By: Richard Beacroft
        /// Updated Date: 11\10\2013
        /// Description: Enables one to be able to have sql text within an iterate element that references the current item as "[]."
        /// This is then parsed, along with any reflection path suffix to get the object instance the used is interested in.
        /// and add it to an attributes collection for later use.
        public override int DoStartFragment(SqlTagContext ctx, SqlTag tag, object parameterObject)
        {
            var iterate = (IterateContext)ctx.GetAttribute(tag);

            if (iterate == null)
            {
                var baseTag = (BaseTag)tag;

                object collection;

                if (!string.IsNullOrEmpty(baseTag.Property))
                {
                    // this will either leave the property name as it is, or if it starts with "[].", the
                    // current iterate context item value will be used, with the rest of the property name
                    // walked to determine the field/property to get the value from.
                    collection = _tagPropertyProbe.GetMemberPropertyValue(ctx, baseTag, parameterObject);
                }
                else
                {
                    collection = parameterObject;
                }

                iterate = new IterateContext(collection);

                ctx.AddAttribute(tag, iterate);

                // if there is another item in the iterate array, then we need to include the body.
                if (iterate.MoveNext())
                {
                    return(INCLUDE_BODY);
                }

                iterate.IsCompleted = true;

                return(SKIP_BODY);
            }

            if (iterate.IsCompleted)
            {
                // reset the context to cater for nested iterations.
                ctx.RemoveAttibute(tag);
                // now re-process the tag which will re-add the now modified tag element back to the attributes collection.
                return(DoStartFragment(ctx, tag, parameterObject));
            }
            else if (iterate.HasNext || iterate.IsLast)
            {
                if (iterate.MoveNext())
                {
                    return(INCLUDE_BODY);
                }
            }

            return(SKIP_BODY);
        }
Exemplo n.º 3
0
        /// <summary>
        /// This class is responsible for getting the current iterate item object within an iteration. i.e. The property name starts with "[]."
        /// We do this by navigating up through the parent nodes to determine which of them are iterate elements.
        /// Once found we get the current iteration context item.
        /// If "[]." is not specified, the original approach is used of reflecting the parameterObject to the reflection path specified in the property
        /// </summary>
        /// <param name="ctx"></param>
        /// <param name="baseTag"></param>
        /// <param name="parameterObject"></param>
        /// <returns></returns>
        /// <remarks>
        /// Created By: Richard Beacroft
        /// Created Date: 11\10\2013
        /// </remarks>
        protected object GetMemberPropertyValue(SqlTagContext ctx, BaseTag baseTag, object parameterObject)
        {
            if (String.IsNullOrEmpty(baseTag.Property))
            {
                return(parameterObject);
            }

            var bindingReplacement = ctx.BuildPropertyBindingReplacements(baseTag).FirstOrDefault();

            if (bindingReplacement != null)
            {
                if (String.IsNullOrEmpty(bindingReplacement.FullPropertyName))
                {
                    return(bindingReplacement.Value);
                }
                return(_tagPropertyProbe.GetMemberValue(ctx, baseTag, bindingReplacement.FullPropertyName, parameterObject));
            }

            return(_tagPropertyProbe.GetMemberPropertyValue(ctx, baseTag, parameterObject));
        }