From 0c36f77c4fa1ecb8e2aab5449ef5a661be3dedb1 Mon Sep 17 00:00:00 2001 From: yekalkan Date: Mon, 30 Apr 2018 10:23:11 +0300 Subject: [PATCH] Form create from single model (Basic func.) --- .../Form/AbpDynamicformTagHelper.cs | 7 ++ .../Form/AbpDynamicformTagHelperService.cs | 66 ++++++++++++++++++- .../Pages/Components/Forms.cshtml | 10 ++- .../Pages/Components/Forms.cshtml.cs | 12 +++- 4 files changed, 90 insertions(+), 5 deletions(-) diff --git a/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpDynamicformTagHelper.cs b/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpDynamicformTagHelper.cs index e09daf87a1..4dc417967f 100644 --- a/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpDynamicformTagHelper.cs +++ b/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpDynamicformTagHelper.cs @@ -1,5 +1,7 @@ using JetBrains.Annotations; +using Microsoft.AspNetCore.Mvc.Rendering; using Microsoft.AspNetCore.Mvc.ViewFeatures; +using Microsoft.AspNetCore.Razor.TagHelpers; namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form { @@ -7,6 +9,11 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form { public ModelExpression Model { get; set; } + + [HtmlAttributeNotBound] + [ViewContext] + public ViewContext ViewContext { get; set; } + public AbpDynamicFormTagHelper(AbpDynamicFormTagHelperService tagHelperService) : base(tagHelperService) { diff --git a/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpDynamicformTagHelperService.cs b/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpDynamicformTagHelperService.cs index 584f342abc..9a043d8a06 100644 --- a/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpDynamicformTagHelperService.cs +++ b/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpDynamicformTagHelperService.cs @@ -1,9 +1,11 @@ using System; using System.Collections.Generic; using System.IO; +using System.Linq; using System.Text; using System.Text.Encodings.Web; using System.Threading.Tasks; +using Microsoft.AspNetCore.Mvc.ViewFeatures; using Microsoft.AspNetCore.Razor.TagHelpers; using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Microsoft.AspNetCore.Razor.TagHelpers; @@ -24,9 +26,71 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form public override void Process(TagHelperContext context, TagHelperOutput output) { - var model = TagHelper.Model; + output.TagName = "form"; + output.Attributes.Add("method","post"); + output.Attributes.Add("action","#"); + var innerhtml = GetInnerHtmlContent(); + + output.PreContent.SetHtmlContent(innerhtml); + } + + protected virtual string GetInnerHtmlContent() + { + var innerHtmlcontent = ""; + var models = ExploreModelsRecursively(new List(), TagHelper.Model.ModelExplorer); + + foreach (var model in models) + { + innerHtmlcontent += ProcessField(model); + } + + return innerHtmlcontent; + } + + protected virtual string ProcessField(ModelExpression model) + { + _abpInputTagHelper.AspFor = model; + _abpInputTagHelper.Label = ""; + _abpInputTagHelper.ViewContext = TagHelper.ViewContext; + + return RenderTagHelper(new TagHelperAttributeList(), _abpInputTagHelper,_htmlEncoder,"div",TagMode.StartTagAndEndTag) + + Environment.NewLine; } + protected virtual List ExploreModelsRecursively(List list, ModelExplorer model) + { + if (IsCsharpClassOrPrimitive(model.ModelType)) + { + list.Add(ModelExplorerToModelExpressionConverter(model)); + return list; + } + + return model.Properties.Aggregate(list, ExploreModelsRecursively); + } + + protected virtual ModelExpression ModelExplorerToModelExpressionConverter(ModelExplorer explorer) + { + return new ModelExpression(explorer.Metadata.PropertyName, explorer); + } + + protected virtual bool IsCsharpClassOrPrimitive(Type type) + { + return type.IsPrimitive || + type.IsValueType || + type == typeof(DateTime) || + type == typeof(ValueType) || + type == typeof(String) || + type == typeof(Decimal) || + type == typeof(Double) || + type == typeof(Guid) || + type == typeof(TimeSpan) || + type == typeof(DateTimeOffset) || + type == typeof(Single) || + type == typeof(Int16) || + type == typeof(Int32) || + type == typeof(Int64) || + type.IsEnum; + } } } \ No newline at end of file diff --git a/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/Pages/Components/Forms.cshtml b/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/Pages/Components/Forms.cshtml index e8bd5cdaf7..9135ed047d 100644 --- a/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/Pages/Components/Forms.cshtml +++ b/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/Pages/Components/Forms.cshtml @@ -9,7 +9,7 @@

Based on Bootstrap form.

-

# Example

+

# Dynamic Form Example

@@ -24,11 +24,15 @@
+ + +

# Input Group Example

+
- - + + diff --git a/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/Pages/Components/Forms.cshtml.cs b/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/Pages/Components/Forms.cshtml.cs index 713619eb1e..20301a221c 100644 --- a/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/Pages/Components/Forms.cshtml.cs +++ b/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/Pages/Components/Forms.cshtml.cs @@ -51,11 +51,14 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo.Pages.Components new SelectListItem { Value = "US", Text = "USA" }, }; + public static IEnumerable EnumCityList; + public void OnGet() { Name = "MyName"; Day = DateTime.Today; - + //var htmlHelper = new HtmlHelper(); + //EnumCityList = htmlHelper.GetEnumSelectList(typeof(Cities)); } } @@ -75,6 +78,13 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo.Pages.Components public Cities City { get; set; } public Phone Phone { get; set; } + + [DataType(DataType.Date)] + [DisplayName("Day")] + public DateTime Day { get; set; } + + [DisplayName("Is Active")] + public bool IsActive { get; set; } } public class Phone