Browse Source

Form create from single model (Basic func.)

pull/272/head
yekalkan 8 years ago
parent
commit
0c36f77c4f
  1. 7
      src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpDynamicformTagHelper.cs
  2. 66
      src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpDynamicformTagHelperService.cs
  3. 10
      test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/Pages/Components/Forms.cshtml
  4. 12
      test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/Pages/Components/Forms.cshtml.cs

7
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)
{

66
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<ModelExpression>(), 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<ModelExpression> ExploreModelsRecursively(List<ModelExpression> 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;
}
}
}

10
test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/Pages/Components/Forms.cshtml

@ -9,7 +9,7 @@
<p>Based on <a href="http://getbootstrap.com/docs/4.1/components/forms/" target="_blank"> Bootstrap form</a>.</p>
<h4># Example</h4>
<h4># Dynamic Form Example</h4>
<div class="demo-with-code">
<div class="demo-area">
@ -24,11 +24,15 @@
</pre>
</div>
</div>
<h4># Input Group Example</h4>
<div class="demo-with-code">
<div class="demo-area">
<form method="post" action="#">
<abp-input asp-for="@Model.Name"/>
<abp-input asp-for="@Model.Password" label="Password"/>
<abp-input asp-for="@Model.Name" />
<abp-input asp-for="@Model.Password" label="Password" />
<abp-input asp-for="@Model.IsActive" />
<abp-input asp-for="@Model.PhoneNumber" />
<abp-input asp-for="@Model.EmailAddress" />

12
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<SelectListItem> 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

Loading…
Cancel
Save