Browse Source

Merge branch 'master' of https://github.com/aspnetzero/abp

pull/279/head
Halil İbrahim Kalkan 8 years ago
parent
commit
cbffd9ea11
  1. 6
      src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/AbpTagHelperService.cs
  2. 56
      src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpDynamicformTagHelper.cs
  3. 42
      src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpDynamicformTagHelperService.cs
  4. 2
      src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DisplayOrder.cs
  5. 3439
      test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/Logs/logs.txt
  6. 6
      test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/Pages/Components/DynamicForms.cshtml
  7. 10
      test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/Pages/Components/DynamicForms.cshtml.cs

6
src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/AbpTagHelperService.cs

@ -81,6 +81,10 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers
protected virtual List<FormGroupItem> GetFormGroupContentsList(TagHelperContext context) protected virtual List<FormGroupItem> GetFormGroupContentsList(TagHelperContext context)
{ {
if (!context.Items.ContainsKey(FormGroupContents))
{
return new List<FormGroupItem>();
}
return context.Items[FormGroupContents] as List<FormGroupItem>; return context.Items[FormGroupContents] as List<FormGroupItem>;
} }
@ -93,7 +97,7 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers
protected virtual int GetInputOrder(ModelExplorer explorer) protected virtual int GetInputOrder(ModelExplorer explorer)
{ {
return GetAttribute<DisplayOrder>(explorer)?.Number ?? 0; return GetAttribute<DisplayOrder>(explorer)?.Number ?? DisplayOrder.Default;
} }
protected virtual void AddGroupToFormGroupContents(TagHelperContext context, string propertyName, string html, int order) protected virtual void AddGroupToFormGroupContents(TagHelperContext context, string propertyName, string html, int order)

56
src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpDynamicformTagHelper.cs

@ -1,19 +1,67 @@
using Microsoft.AspNetCore.Mvc.Rendering; using System;
using System.Collections.Generic;
using System.ComponentModel;
using Microsoft.AspNetCore.Mvc.Rendering;
using Microsoft.AspNetCore.Mvc.ViewFeatures; using Microsoft.AspNetCore.Mvc.ViewFeatures;
using Microsoft.AspNetCore.Razor.TagHelpers; using Microsoft.AspNetCore.Razor.TagHelpers;
namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form
{ {
[HtmlTargetElement("form", Attributes = "abp-dynamic-form", TagStructure = TagStructure.NormalOrSelfClosing)] [HtmlTargetElement("abp-dynamic-form", TagStructure = TagStructure.NormalOrSelfClosing)]
public class AbpDynamicFormTagHelper : AbpTagHelper<AbpDynamicFormTagHelper, AbpDynamicFormTagHelperService> public class AbpDynamicFormTagHelper : AbpTagHelper<AbpDynamicFormTagHelper, AbpDynamicFormTagHelperService>
{ {
[HtmlAttributeName("abp-dynamic-form")] [HtmlAttributeName("abp-model")]
public ModelExpression Model { get; set; } public ModelExpression Model { get; set; }
[HtmlAttributeNotBound] [HtmlAttributeNotBound]
[ViewContext] [ViewContext]
public ViewContext ViewContext { get; set; } public ViewContext ViewContext { get; set; }
#region MvcFormTagHelperAttiributes
private const string ActionAttributeName = "asp-action";
private const string AntiforgeryAttributeName = "asp-antiforgery";
private const string AreaAttributeName = "asp-area";
private const string PageAttributeName = "asp-page";
private const string PageHandlerAttributeName = "asp-page-handler";
private const string FragmentAttributeName = "asp-fragment";
private const string ControllerAttributeName = "asp-controller";
private const string RouteAttributeName = "asp-route";
private const string RouteValuesDictionaryName = "asp-all-route-data";
private const string RouteValuesPrefix = "asp-route-";
[HtmlAttributeName(ActionAttributeName)]
public string Action { get; set; }
[HtmlAttributeName(ControllerAttributeName)]
public string Controller { get; set; }
[HtmlAttributeName(AreaAttributeName)]
public string Area { get; set; }
[HtmlAttributeName(PageAttributeName)]
public string Page { get; set; }
[HtmlAttributeName(PageHandlerAttributeName)]
public string PageHandler { get; set; }
[HtmlAttributeName(AntiforgeryAttributeName)]
public bool? Antiforgery { get; set; }
[HtmlAttributeName(FragmentAttributeName)]
public string Fragment { get; set; }
[HtmlAttributeName(RouteAttributeName)]
public string Route { get; set; }
[EditorBrowsable(EditorBrowsableState.Never)]
public string Method { get; set; }
[HtmlAttributeName(RouteValuesDictionaryName, DictionaryAttributePrefix = RouteValuesPrefix)]
public IDictionary<string, string> RouteValues { get; set; }
#endregion
public AbpDynamicFormTagHelper(AbpDynamicFormTagHelperService tagHelperService) public AbpDynamicFormTagHelper(AbpDynamicFormTagHelperService tagHelperService)
: base(tagHelperService) : base(tagHelperService)
{ {

42
src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpDynamicformTagHelperService.cs

@ -6,6 +6,7 @@ using System.Text;
using System.Text.Encodings.Web; using System.Text.Encodings.Web;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc.Rendering; using Microsoft.AspNetCore.Mvc.Rendering;
using Microsoft.AspNetCore.Mvc.TagHelpers;
using Microsoft.AspNetCore.Mvc.ViewFeatures; using Microsoft.AspNetCore.Mvc.ViewFeatures;
using Microsoft.AspNetCore.Razor.TagHelpers; using Microsoft.AspNetCore.Razor.TagHelpers;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
@ -16,13 +17,16 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form
public class AbpDynamicFormTagHelperService : AbpTagHelperService<AbpDynamicFormTagHelper> public class AbpDynamicFormTagHelperService : AbpTagHelperService<AbpDynamicFormTagHelper>
{ {
private readonly HtmlEncoder _htmlEncoder; private readonly HtmlEncoder _htmlEncoder;
private readonly IHtmlGenerator _htmlGenerator;
private readonly IServiceProvider _serviceProvider; private readonly IServiceProvider _serviceProvider;
public AbpDynamicFormTagHelperService( public AbpDynamicFormTagHelperService(
HtmlEncoder htmlEncoder, HtmlEncoder htmlEncoder,
IHtmlGenerator htmlGenerator,
IServiceProvider serviceProvider) IServiceProvider serviceProvider)
{ {
_htmlEncoder = htmlEncoder; _htmlEncoder = htmlEncoder;
_htmlGenerator = htmlGenerator;
_serviceProvider = serviceProvider; _serviceProvider = serviceProvider;
} }
@ -31,19 +35,47 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form
var list = InitilizeFormGroupContentsContext(context); var list = InitilizeFormGroupContentsContext(context);
NormalizeTagMode(context, output); NormalizeTagMode(context, output);
SetFormAttributes(output);
await output.GetChildContentAsync(); await output.GetChildContentAsync();
await ConvertToMvcForm(context, output);
ProcessFields(context, output); ProcessFields(context, output);
SetContent(output,list); SetContent(output,list);
SetFormAttributes(output);
}
protected virtual async Task ConvertToMvcForm(TagHelperContext context, TagHelperOutput output)
{
var formTagHelper = new FormTagHelper(_htmlGenerator)
{
Action = TagHelper.Action,
Controller = TagHelper.Controller,
Area = TagHelper.Area,
Page = TagHelper.Page,
PageHandler = TagHelper.PageHandler,
Antiforgery = TagHelper.Antiforgery,
Fragment = TagHelper.Fragment,
Route = TagHelper.Route,
Method = TagHelper.Method,
RouteValues = TagHelper.RouteValues,
ViewContext = TagHelper.ViewContext
};
var formTagOutput = GetInnerTagHelper(output.Attributes, context, formTagHelper, "form", TagMode.StartTagAndEndTag);
await formTagOutput.GetChildContentAsync();
output.PostContent.SetHtmlContent(output.PostContent.GetContent() + formTagOutput.PostContent.GetContent());
output.PreContent.SetHtmlContent(output.PreContent.GetContent() + formTagOutput.PreContent.GetContent());
} }
protected virtual void NormalizeTagMode(TagHelperContext context, TagHelperOutput output) protected virtual void NormalizeTagMode(TagHelperContext context, TagHelperOutput output)
{ {
output.TagMode = TagMode.StartTagAndEndTag; output.TagMode = TagMode.StartTagAndEndTag;
output.TagName = "form";
} }
protected virtual void SetFormAttributes(TagHelperOutput output) protected virtual void SetFormAttributes(TagHelperOutput output)
@ -53,14 +85,14 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form
protected virtual void SetContent(TagHelperOutput output, List<FormGroupItem> items) protected virtual void SetContent(TagHelperOutput output, List<FormGroupItem> items)
{ {
var postContentBuilder = new StringBuilder(output.PostContent.GetContent()); var preContentBuilder = new StringBuilder(output.PreContent.GetContent());
foreach (var item in items.OrderBy(o => o.Order)) foreach (var item in items.OrderBy(o => o.Order))
{ {
postContentBuilder.AppendLine(item.HtmlContent); preContentBuilder.AppendLine(item.HtmlContent);
} }
output.PostContent.SetHtmlContent(postContentBuilder.ToString()); output.PreContent.SetHtmlContent(preContentBuilder.ToString());
} }
protected virtual List<FormGroupItem> InitilizeFormGroupContentsContext(TagHelperContext context) protected virtual List<FormGroupItem> InitilizeFormGroupContentsContext(TagHelperContext context)

2
src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DisplayOrder.cs

@ -8,6 +8,8 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form
[AttributeUsage(AttributeTargets.Property)] [AttributeUsage(AttributeTargets.Property)]
public class DisplayOrder : Attribute public class DisplayOrder : Attribute
{ {
public static int Default = 10000;
public int Number { get; set; } public int Number { get; set; }
public DisplayOrder(int number) public DisplayOrder(int number)

3439
test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/Logs/logs.txt

File diff suppressed because it is too large

6
test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/Pages/Components/DynamicForms.cshtml

@ -12,9 +12,11 @@
<div class="demo-with-code"> <div class="demo-with-code">
<div class="demo-area"> <div class="demo-area">
<form abp-dynamic-form="@Model.PersonInput" asp-antiforgery="true"> <abp-dynamic-form abp-model="@Model.PersonInput" asp-antiforgery="true" asp-controller="Demo" asp-action="Register">
<abp-button type="submit" button-type="Primary" text="Submit" /> <abp-button type="submit" button-type="Primary" text="Submit" />
@*<abp-input asp-for="PersonInput.Name"></abp-input>*@ <abp-input asp-for="@Model.PersonInput.Phone.Number" label="Phone Number"/>
</abp-dynamic-form>
<form asp-antiforgery="true" asp-controller="Demo" asp-action="Register">
</form> </form>
<hr /> <hr />
<h5>Posted Values:</h5> <h5>Posted Values:</h5>

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

@ -22,6 +22,8 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo.Pages.Components
{ {
Name = "John", Name = "John",
Age = 65, Age = 65,
Country = "CA",
Day = DateTime.Now,
Phone = new PhoneModel { Number = "326346231", Name = "MyPhone" } Phone = new PhoneModel { Number = "326346231", Name = "MyPhone" }
}; };
} }
@ -39,7 +41,6 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo.Pages.Components
public string Name { get; set; } = "MyName"; public string Name { get; set; } = "MyName";
[Required] [Required]
[DisplayOrder(61)]
[DisplayName("Age")] [DisplayName("Age")]
[Range(1, 100)] [Range(1, 100)]
public int Age { get; set; } public int Age { get; set; }
@ -52,9 +53,9 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo.Pages.Components
[DataType(DataType.Date)] [DataType(DataType.Date)]
[DisplayName("Day")] [DisplayName("Day")]
[DisplayOrder(10003)]
public DateTime Day { get; set; } public DateTime Day { get; set; }
[DisplayOrder(51)]
[DisplayName("Is Active")] [DisplayName("Is Active")]
public bool IsActive { get; set; } public bool IsActive { get; set; }
@ -73,11 +74,12 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo.Pages.Components
public class PhoneModel public class PhoneModel
{ {
[Required] [Required]
[DisplayOrder(10002)]
[DisplayName("Number")] [DisplayName("Number")]
public string Number { get; set; } public string Number { get; set; }
[Required] [Required]
[DisplayOrder(71)] [DisplayOrder(10001)]
[DisplayName("PhoneName")] [DisplayName("PhoneName")]
public string Name { get; set; } public string Name { get; set; }
} }

Loading…
Cancel
Save