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); } } } }
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); } } }