Пример #1
0
        private void SetupValue(IAction action, IMvcContext context)
        {
            var paramname = Name;

            if (TargetType.IsAbstract)
            {
                return;
            }

            if (TargetType == typeof(XElement))
            {
                var val = context.GetXml(Name);
                SetDirectly(action, val);
            }
            else if (TargetType.IsArray)
            {
                object val;
                var    arr = context.GetObject(paramname);
                if (arr is Array)
                {
                    var resultArray =
                        ((IEnumerable)arr).OfType <object>().Select(_ => _.ToTargetType(TargetType.GetElementType())).ToArray();
                    var t = Array.CreateInstance(TargetType.GetElementType(), resultArray.Length);
                    Array.Copy(resultArray, t, resultArray.Length);
                    val = t;
                }
                else
                {
                    if (_bindattribute.Split)
                    {
                        var str = context.Get(paramname);
                        var a   = str.SmartSplit().Select(_ => _.ToTargetType(TargetType.GetElementType())).ToArray();
                        var t   = Array.CreateInstance(TargetType.GetElementType(), a.Length);
                        Array.Copy(a, t, a.Length);
                        val = t;
                    }
                    else
                    {
                        val = context.GetArray(TargetType.GetElementType(), paramname);
                    }
                }
                SetDirectly(action, val);
            }
            else if (typeof(IDictionary <string, string>) == TargetType)
            {
                var current = (IDictionary <string, string>)GetCurrent(action);
                if (null == current)
                {
                    current = new Dictionary <string, string>();
                    SetDirectly(action, current);
                }

                IDictionary <string, string> val;
                if (IsComplexString)
                {
                    var str = context.Get(paramname);
                    val = ComplexStringExtension.Parse(str);
                }
                else
                {
                    val = context.GetDict(paramname);
                }
                foreach (var p in val)
                {
                    current[p.Key] = p.Value;
                }
            }
            else
            {
                object val = context.Get(paramname);
                if (((string)val).IsEmpty())
                {
                    val = _bindattribute.Default;
                }
                var customBindConverter = _bindattribute as ICustomBindConverter;
                if (customBindConverter != null)
                {
                    customBindConverter.SetConverted(action, (string)val, context, SetDirectly);
                    return;
                }
                SetConverted(action, val, context);
            }
        }