public virtual ActionResult Create(Guid?parent = null) { if (!EntityQueryable.Addable()) { return(new HttpStatusCodeResult(403)); } if (!Metadata.AddRoles.All(t => User.IsInRole(t))) { return(new HttpStatusCodeResult(403)); } var model = new EntityEditModel <TEntity>(EntityQueryable.Create()); model.Item.Index = Guid.Empty; model.Properties = Metadata.EditProperties; if (parent != null && model.Metadata.ParentProperty != null) { dynamic parentContext = EntityBuilder.GetContext(model.Metadata.ParentProperty.Property.PropertyType); object parentObj = parentContext.GetEntity(parent.Value); model.Metadata.ParentProperty.Property.SetValue(model.Item, parentObj); } return(View("Edit", model)); }
public virtual ActionResult Update(Guid id) { TEntity entity; if (id == Guid.Empty) { if (!EntityQueryable.Addable()) { return(new HttpStatusCodeResult(403)); } if (!Metadata.AddRoles.All(t => User.IsInRole(t))) { return(new HttpStatusCodeResult(403)); } entity = EntityQueryable.Create(); } else { if (!EntityQueryable.Editable()) { return(new HttpStatusCodeResult(403)); } if (!Metadata.EditRoles.All(t => User.IsInRole(t))) { return(new HttpStatusCodeResult(403)); } entity = EntityQueryable.GetEntity(id); if (entity == null) { return(new HttpStatusCodeResult(404)); } } var properties = Metadata.Properties.Where(t => !t.IsHiddenOnEdit).ToArray(); for (int i = 0; i < properties.Length; i++) { PropertyMetadata propertyMetadata = properties[i]; if (propertyMetadata.Type == ComponentModel.DataAnnotations.CustomDataType.File || propertyMetadata.Type == ComponentModel.DataAnnotations.CustomDataType.Image) { #region File Path Value if (!Request.Files.AllKeys.Contains(propertyMetadata.Property.Name)) { continue; } if (!(this is IFileController <TEntity>)) { throw new NotSupportedException("Controller doesn't support upload file."); } ((IFileController <TEntity>) this).SaveFileToProperty(entity, propertyMetadata, Request.Files[propertyMetadata.Property.Name]); #endregion } else { #region Property Value if (!Request.Form.AllKeys.Contains(propertyMetadata.Property.Name)) { if (id == Guid.Empty && propertyMetadata.IsRequired) { Response.StatusCode = 400; return(Content(propertyMetadata.Name + "为必填项")); } continue; } string originValue = Request.Form[propertyMetadata.Property.Name]; if (string.IsNullOrEmpty(originValue) && propertyMetadata.Property.PropertyType != typeof(string) && propertyMetadata.IsRequired) { Response.StatusCode = 400; return(Content(propertyMetadata.Name + "为必填项")); } //Type type = propertyMetadata.Property.PropertyType; //if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>)) // type = type.GetGenericArguments()[0]; TypeConverter converter = EntityValueConverter.GetConverter(propertyMetadata); if (converter == null) { if (propertyMetadata.Property.PropertyType.IsGenericType && propertyMetadata.Property.PropertyType.GetGenericTypeDefinition() == typeof(ICollection <>)) { converter = new Converter.CollectionConverter(); } else if (propertyMetadata.Property.PropertyType.IsEnum) { converter = new EnumConverter(propertyMetadata.Property.PropertyType); } else if (propertyMetadata.Type != ComponentModel.DataAnnotations.CustomDataType.Password) { throw new NotSupportedException("Type of \"" + propertyMetadata.Property.PropertyType.Name + "\" converter not found."); } } if (propertyMetadata.Type == ComponentModel.DataAnnotations.CustomDataType.Password && entity is IPassword) { object v = propertyMetadata.Property.GetValue(entity); if (v == null || originValue != v.ToString()) { ((IPassword)entity).SetPassword(originValue); } } else { EntityValueConverterContext context = new EntityValueConverterContext(EntityBuilder.DescriptorContext, propertyMetadata); object value = converter.ConvertFrom(context, null, originValue); if (converter.GetType() == typeof(Converter.CollectionConverter)) { object collection = propertyMetadata.Property.GetValue(entity); ((dynamic)collection).Clear(); var addMethod = collection.GetType().GetMethod("Add"); object[] array = (object[])value; for (int a = 0; a < array.Length; a++) { addMethod.Invoke(collection, new object[] { array[a] }); } } else { propertyMetadata.Property.SetValue(entity, value); } } #endregion } } var validateResult = entity.Validate(null); if (validateResult.Count() != 0) { Response.StatusCode = 400; return(Content(new string(validateResult.SelectMany(t => t.ErrorMessage += "/r/n").ToArray()))); } bool result; if (id == Guid.Empty) { result = EntityQueryable.Add(entity); } else { result = EntityQueryable.Edit(entity); } if (result) { return(Content(entity.Index.ToString())); } else { Response.StatusCode = 400; return(Content("未知")); } }
protected virtual Task <EntityViewModel <TEntity> > GetViewModel(IQueryable <TEntity> queryable, int page, int size) { return(Task.Run <EntityViewModel <TEntity> >(() => { EntityViewModel <TEntity> model = new EntityViewModel <TEntity>(queryable, page, size); model.Headers = Metadata.ViewProperties; EntityViewButton createButton = new EntityViewButton(); createButton.Name = "Create"; createButton.GetInvokeDelegate = new EntityViewButtonCommandDelegate(viewer => { return new Task(async() => { var item = EntityQueryable.Create(); bool?result = null; await viewer.Dispatcher.Invoke(async() => { viewer.IsLoading = true; var editor = await GetEditor(item); result = editor.ShowDialog(); }); if (result == true) { await Update(item); model.UpdateTotalPage(); model.Items = model.Items.Concat(new TEntity[] { item }).ToArray(); } viewer.Dispatcher.Invoke(() => { viewer.IsLoading = false; }); }); }); model.ViewButtons = new IViewButton[] { createButton }; EntityItemButton editButton = new EntityItemButton(); editButton.Name = "Edit"; editButton.GetInvokeDelegate = new EntityItemButtonCommandDelegate((viewer, entity) => { return new Task(async() => { var item = (TEntity)entity; bool?result = null; await viewer.Dispatcher.Invoke(async() => { viewer.IsLoading = true; var editor = await GetEditor(item); result = editor.ShowDialog(); }); if (result == true) { await Update(item); } viewer.Dispatcher.Invoke(() => { viewer.IsLoading = false; }); }); }); EntityItemButton removeButton = new EntityItemButton(); removeButton.Name = "Remove"; removeButton.GetInvokeDelegate = new EntityItemButtonCommandDelegate((viewer, entity) => { return new Task(async() => { viewer.Dispatcher.Invoke(() => { viewer.IsLoading = true; }); await EntityQueryable.RemoveAsync(entity.Index); model.Items = await EntityQueryable.ToArrayAsync(queryable.Skip(page).Take(size)); viewer.Dispatcher.Invoke(() => { viewer.IsLoading = false; }); }); }); model.ItemButtons = new IEntityViewButton[] { editButton, removeButton }; return model; })); }