Browse Source

Abp-form tag now has standard mvc tag helper attributes

pull/279/head
yekalkan 9 years ago
parent
commit
dacc1324be
  1. 4
      src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/AbpTagHelperService.cs
  2. 56
      src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpDynamicformTagHelper.cs
  3. 43
      src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpDynamicformTagHelperService.cs
  4. 3065
      test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/Logs/logs.txt
  5. 6
      test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/Pages/Components/DynamicForms.cshtml
  6. 1
      test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/Pages/Components/DynamicForms.cshtml.cs

4
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)
{
if (!context.Items.ContainsKey(FormGroupContents))
{
return new List<FormGroupItem>();
}
return context.Items[FormGroupContents] as List<FormGroupItem>;
}

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.Razor.TagHelpers;
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>
{
[HtmlAttributeName("abp-dynamic-form")]
[HtmlAttributeName("abp-model")]
public ModelExpression Model { get; set; }
[HtmlAttributeNotBound]
[ViewContext]
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)
: base(tagHelperService)
{

43
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.Threading.Tasks;
using Microsoft.AspNetCore.Mvc.Rendering;
using Microsoft.AspNetCore.Mvc.TagHelpers;
using Microsoft.AspNetCore.Mvc.ViewFeatures;
using Microsoft.AspNetCore.Razor.TagHelpers;
using Microsoft.Extensions.DependencyInjection;
@ -16,13 +17,16 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form
public class AbpDynamicFormTagHelperService : AbpTagHelperService<AbpDynamicFormTagHelper>
{
private readonly HtmlEncoder _htmlEncoder;
private readonly IHtmlGenerator _htmlGenerator;
private readonly IServiceProvider _serviceProvider;
public AbpDynamicFormTagHelperService(
HtmlEncoder htmlEncoder,
IHtmlGenerator htmlGenerator,
IServiceProvider serviceProvider)
{
_htmlEncoder = htmlEncoder;
_htmlGenerator = htmlGenerator;
_serviceProvider = serviceProvider;
}
@ -31,19 +35,48 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form
var list = InitilizeFormGroupContentsContext(context);
NormalizeTagMode(context, output);
SetFormAttributes(output);
await output.GetChildContentAsync();
await ConvertToMvcForm(context, output);
ProcessFields(context, output);
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());
output.Content.SetHtmlContent(output.Content.GetContent() + formTagOutput.Content.GetContent());
}
protected virtual void NormalizeTagMode(TagHelperContext context, TagHelperOutput output)
{
output.TagMode = TagMode.StartTagAndEndTag;
output.TagName = "form";
}
protected virtual void SetFormAttributes(TagHelperOutput output)
@ -53,14 +86,14 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form
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))
{
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)

3065
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-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-input asp-for="PersonInput.Name"></abp-input>*@
<abp-input asp-for="PersonInput.Name" label="xd"></abp-input>
</abp-dynamic-form>
<form asp-antiforgery="true" asp-controller="Demo" asp-action="Register">
</form>
<hr />
<h5>Posted Values:</h5>

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

@ -22,6 +22,7 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo.Pages.Components
{
Name = "John",
Age = 65,
Country = "CA",
Phone = new PhoneModel { Number = "326346231", Name = "MyPhone" }
};
}

Loading…
Cancel
Save