Exemple #1
0
        public virtual void InitByObject(object obj)
        {
            if (obj is Type)
            {
                this.InitByType((Type)obj);
                return;
            }

            IEnumerable collection = obj as IEnumerable;

            if (collection == null)
            {
                this.InitByType(obj.GetType());
                return;
            }

            Type itemType = null;

            IEnumerator enumerator = collection.GetEnumerator();

            if (enumerator.MoveNext())
            {
                if (enumerator.Current != null)
                {
                    itemType = enumerator.Current.GetType();
                }
                enumerator.Reset();
            }

            if (itemType == null)
            {
                itemType = Store.GetEnumerableGenericType(obj.GetType());
            }

            if (itemType == null)
            {
                throw new InvalidOperationException("Cannot determine an item type of Store data");
            }

            this.InitByType(itemType, false);
            this.DataSource = obj;
        }
        public virtual void InitByType(Type type, object data, bool modelOnly = false, string htmlFieldName = "", object additionalViewData = null)
        {
            type = Store.GetEnumerableGenericType(type);

            if (data is IEnumerable)
            {
                data = null;
            }

            ModelMetadata metadata = ModelMetadataProviders.Current.GetMetadataForType(delegate { return(data); }, type);

            if (metadata != null)
            {
                ResourcesRegistrator registrator = metadata.AdditionalValues.ContainsKey(ClientResourceAttribute.KEY) ? (ResourcesRegistrator)metadata.AdditionalValues[ClientResourceAttribute.KEY] : null;

                if (registrator != null)
                {
                    this.Controls.Add(registrator);
                }

                HtmlHelper html = Ext.Net.X.Builder.HtmlHelper;

                ViewDataDictionary viewData = new ViewDataDictionary(html.ViewDataContainer.ViewData)
                {
                    Model         = data,
                    ModelMetadata = metadata,
                    TemplateInfo  = new TemplateInfo
                    {
                        HtmlFieldPrefix = html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(htmlFieldName)
                    }
                };

                if (additionalViewData != null)
                {
                    foreach (KeyValuePair <string, object> kvp in new RouteValueDictionary(additionalViewData))
                    {
                        viewData[kvp.Key] = kvp.Value;
                    }
                }

                HtmlHelper helper = new HtmlHelper(
                    new ViewContext(html.ViewContext, html.ViewContext.View, viewData, html.ViewContext.TempData, html.ViewContext.Writer),
                    new ViewDataContainer(viewData)
                    );

                foreach (ModelMetadata propertyMetadata in metadata.Properties)
                {
                    ModelFieldAttribute modelAttr = propertyMetadata.AdditionalValues.ContainsKey(ModelFieldAttribute.KEY) ? (ModelFieldAttribute)propertyMetadata.AdditionalValues[ModelFieldAttribute.KEY] : null;

                    if (!propertyMetadata.ShowForEdit)
                    {
                        continue;
                    }

                    if (modelAttr == null && this.InitForModelOnly)
                    {
                        continue;
                    }

                    FieldAttribute fieldAttr = propertyMetadata.AdditionalValues.ContainsKey(FieldAttribute.KEY) ? (FieldAttribute)propertyMetadata.AdditionalValues[FieldAttribute.KEY] : null;

                    if ((modelAttr != null && modelAttr.Ignore) || (fieldAttr != null && fieldAttr.Ignore))
                    {
                        continue;
                    }

                    if (propertyMetadata.TemplateHint.IsNotEmpty())
                    {
                        this.Items.Add(new MvcItem(delegate { return(EditorExtensions.Editor(helper, propertyMetadata.PropertyName, propertyMetadata.TemplateHint)); }));
                    }
                    else
                    {
                        Type fieldType = null;

                        if (fieldAttr != null && fieldAttr.FieldType != null)
                        {
                            fieldType = fieldAttr.FieldType;

                            if (!fieldType.IsSubclassOf(typeof(Ext.Net.Field)))
                            {
                                throw new Exception("FieldType must be subclass of Ext.Net.Field");
                            }
                        }
                        else
                        {
                            if (propertyMetadata.IsComplexType)
                            {
                                continue;
                            }

                            if (Store.IsDate(propertyMetadata.ModelType))
                            {
                                fieldType = typeof(Ext.Net.DateField);
                            }
                            else if (Store.IsNumeric(propertyMetadata.ModelType))
                            {
                                fieldType = typeof(Ext.Net.NumberField);
                            }
                            else if (Store.IsBoolean(propertyMetadata.ModelType))
                            {
                                fieldType = typeof(Ext.Net.Checkbox);
                            }
                            else
                            {
                                fieldType = typeof(Ext.Net.TextField);
                            }
                        }

                        Field cmp = (Ext.Net.Field)System.Activator.CreateInstance(fieldType);

                        cmp.ViewContext = helper.ViewContext;
                        cmp.ControlFor  = propertyMetadata.PropertyName;
                        cmp.SetControlFor(propertyMetadata);

                        this.Items.Add(cmp);
                    }
                }
            }
        }
Exemple #3
0
        public virtual void InitByType(Type type, bool extractGeneric = true)
        {
            if (extractGeneric)
            {
                type = Store.GetEnumerableGenericType(type);
            }

            ModelMetadata metadata = ModelMetadataProviders.Current.GetMetadataForType(null, type);

            if (metadata != null)
            {
                var storeModel = this.Model.Primary;
                if (storeModel == null)
                {
                    storeModel = new Model();
                    this.Model.Add(storeModel);
                }

                ModelAttribute storeModelAttr = metadata.AdditionalValues.ContainsKey(ModelAttribute.KEY) ? (ModelAttribute)metadata.AdditionalValues[ModelAttribute.KEY] : null;
                if (storeModelAttr != null)
                {
                    storeModelAttr.CopyTo(storeModel);
                }

                if (metadata.AdditionalValues.ContainsKey(AbstractValidationAttribute.KEY))
                {
                    storeModel.Validations.AddRange((ValidationCollection)metadata.AdditionalValues[AbstractValidationAttribute.KEY]);
                }

                if (metadata.AdditionalValues.ContainsKey(AbstractAssociationAttribute.KEY))
                {
                    storeModel.Associations.AddRange((AssociationCollection)metadata.AdditionalValues[AbstractAssociationAttribute.KEY]);
                }

                if (metadata.AdditionalValues.ContainsKey(ProxyAttribute.KEY))
                {
                    this.Proxy.Add((AbstractProxy)metadata.AdditionalValues[ProxyAttribute.KEY]);
                }

                if (metadata.AdditionalValues.ContainsKey(AbstractReaderAttribute.KEY))
                {
                    if (this.Proxy.Primary != null && this.Proxy.Primary is ServerProxy)
                    {
                        ((ServerProxy)this.Proxy.Primary).Reader.Add((AbstractReader)metadata.AdditionalValues[AbstractReaderAttribute.KEY]);
                    }
                    else
                    {
                        this.Reader.Add((AbstractReader)metadata.AdditionalValues[AbstractReaderAttribute.KEY]);
                    }
                }

                if (metadata.AdditionalValues.ContainsKey(AbstractWriterAttribute.KEY))
                {
                    if (this.Proxy.Primary != null && this.Proxy.Primary is ServerProxy)
                    {
                        ((ServerProxy)this.Proxy.Primary).Writer.Add((AbstractWriter)metadata.AdditionalValues[AbstractWriterAttribute.KEY]);
                    }
                    else
                    {
                        this.Writer.Add((AbstractWriter)metadata.AdditionalValues[AbstractWriterAttribute.KEY]);
                    }
                }

                var virtualFieldsAttr = metadata.AdditionalValues.ContainsKey(ModelFieldAttribute.KEY) ? (List <VirtualModelField>)metadata.AdditionalValues[ModelFieldAttribute.KEY] : null;
                if (virtualFieldsAttr != null)
                {
                    foreach (VirtualModelField attr in virtualFieldsAttr)
                    {
                        var modelField = new ModelField();
                        if (storeModel != null)
                        {
                            attr.CopyTo(modelField, storeModel);
                            storeModel.Fields.Add(modelField);
                        }
                    }
                }

                var registrator = metadata.AdditionalValues.ContainsKey(ClientResourceAttribute.KEY) ? (ResourcesRegistrator)metadata.AdditionalValues[ClientResourceAttribute.KEY] : null;
                if (registrator != null)
                {
                    this.Controls.Add(registrator);
                }

                foreach (ModelMetadata propertyMetadata in metadata.Properties)
                {
                    var modelAttr = propertyMetadata.AdditionalValues.ContainsKey(ModelFieldAttribute.KEY) ? (ModelFieldAttribute)propertyMetadata.AdditionalValues[ModelFieldAttribute.KEY] : null;
                    if (modelAttr == null && this.InitForModelOnly)
                    {
                        continue;
                    }

                    if (modelAttr != null && modelAttr.Ignore)
                    {
                        continue;
                    }

                    Store.CreateModelFieldFromMeta(propertyMetadata, storeModel, modelAttr, this.ControllerContext);
                }
            }
        }