diff --git a/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/AbpTagHelperService.cs b/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/AbpTagHelperService.cs index f85950be37..87c01534f7 100644 --- a/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/AbpTagHelperService.cs +++ b/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/AbpTagHelperService.cs @@ -30,7 +30,7 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers return Task.CompletedTask; } - protected string RenderInputTagHelper(TagHelperAttributeList attributeList, AbpTagHelper abpTagHelper, HtmlEncoder htmlEncoder, string tagName = "div") + protected TagHelperOutput GetInnerTagHelper(TagHelperAttributeList attributeList, TagHelper tagHelper, string tagName = "div") { var innerOutput = new TagHelperOutput(tagName, attributeList, (useCachedResult, encoder) => Task.Run(() => new DefaultTagHelperContent())) { @@ -39,7 +39,21 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers var innerContext = new TagHelperContext(attributeList, new Dictionary(), Guid.NewGuid().ToString()); - abpTagHelper.Process(innerContext, innerOutput); + tagHelper.Process(innerContext, innerOutput); + + return innerOutput; + } + + protected string RenderTagHelper(TagHelperAttributeList attributeList, TagHelper tagHelper, HtmlEncoder htmlEncoder, string tagName = "div") + { + var innerOutput = new TagHelperOutput(tagName, attributeList, (useCachedResult, encoder) => Task.Run(() => new DefaultTagHelperContent())) + { + TagMode = TagMode.SelfClosing + }; + + var innerContext = new TagHelperContext(attributeList, new Dictionary(), Guid.NewGuid().ToString()); + + tagHelper.Process(innerContext, innerOutput); return RenderTagHelperOutput(innerOutput, htmlEncoder); } diff --git a/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpFormGroupTagHelperService.cs b/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpFormGroupTagHelperService.cs index 6f8b230c6d..fed6ccb684 100644 --- a/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpFormGroupTagHelperService.cs +++ b/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpFormGroupTagHelperService.cs @@ -35,8 +35,8 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form // {"Type", "Text"}, // {"Placeholder", "plcHlder"} //}; - - //output.Content.AppendHtml(RenderInputTagHelper(attributes, _abpInputTagHelper, _htmlEncoder)); + + //output.Content.AppendHtml(RenderTagHelper(attributes, _abpInputTagHelper, _htmlEncoder)); } diff --git a/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpInputTagHelper.cs b/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpInputTagHelper.cs index 7b9e823b29..66915777de 100644 --- a/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpInputTagHelper.cs +++ b/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpInputTagHelper.cs @@ -1,13 +1,17 @@ -using Microsoft.AspNetCore.Razor.TagHelpers; - - -using JetBrains.Annotations; +using Microsoft.AspNetCore.Mvc.Rendering; +using Microsoft.AspNetCore.Mvc.ViewFeatures; +using Microsoft.AspNetCore.Razor.TagHelpers; using Volo.Abp.DependencyInjection; namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form { public class AbpInputTagHelper : AbpTagHelper, ITransientDependency { + public ModelExpression AspFor { get; set; } + + [HtmlAttributeNotBound] + [ViewContext] + public ViewContext ViewContext { get; set; } public AbpInputTagHelper(AbpInputTagHelperService tagHelperService) : base(tagHelperService) diff --git a/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpInputTagHelperService.cs b/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpInputTagHelperService.cs index 357543793c..d5a726ffe3 100644 --- a/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpInputTagHelperService.cs +++ b/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpInputTagHelperService.cs @@ -1,5 +1,9 @@ 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 Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Microsoft.AspNetCore.Razor.TagHelpers; @@ -7,11 +11,44 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form { public class AbpInputTagHelperService : AbpTagHelperService { + private readonly HtmlEncoder _htmlEncoder; + private readonly IHtmlGenerator _generator; + + public AbpInputTagHelperService(HtmlEncoder htmlEncoder, IHtmlGenerator generator) + { + _htmlEncoder = htmlEncoder; + _generator = generator; + } + public override void Process(TagHelperContext context, TagHelperOutput output) { output.TagName = "input"; - output.Attributes.AddClass("form-control"); - output.TagMode = TagMode.SelfClosing; + + ProcessAttributes(output); + } + + protected virtual void ProcessAttributes(TagHelperOutput output) + { + var inputTagHelperOutput = GetAttributes(); + + foreach (var tagHelperAttribute in inputTagHelperOutput.Attributes) + { + output.Attributes.Add(tagHelperAttribute); + } + + output.Attributes.RemoveAll("asp-for"); + output.Attributes.Add("class", "form-control"); + } + + protected virtual TagHelperOutput GetAttributes() + { + var inputTagHelper = new InputTagHelper(_generator) + { + For = TagHelper.AspFor, + ViewContext = TagHelper.ViewContext + }; + + return GetInnerTagHelper(new TagHelperAttributeList(), inputTagHelper); } } } \ 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 5f34a0ebf1..748f01f983 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 @@ -12,24 +12,53 @@
- - - - - - - +
+ + + + + + + + + + + + + + + + + + + + + +
       
         <abp-form-group>
-            <abp-input type="text"/>
+            <abp-input asp-for="@Model.Name" />
         </abp-form-group>
-        <abp-form-group checkbox="true">
-            <input type="checkbox" class="form-check-input" id="exampleCheck1">
-            <label class="form-check-label" for="exampleCheck1">Check me out</label>
+        <abp-form-group>
+            <abp-input asp-for="@Model.Password" />
+        </abp-form-group>
+        <abp-form-group>
+            <abp-input asp-for="@Model.PhoneNumber" />
+        </abp-form-group>
+        <abp-form-group>
+            <abp-input asp-for="@Model.EmailAddress" />
+        </abp-form-group>
+        <abp-form-group>
+            <abp-input asp-for="@Model.Count" />
+        </abp-form-group>
+        <abp-form-group>
+            <abp-input asp-for="@Model.Day" />
+        </abp-form-group>
+        <abp-form-group>
+            <abp-input asp-for="@Model.IsActive" />
         </abp-form-group>
         
-
- + \ No newline at end of file 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 ab186db51a..fcc8347a99 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 @@ -1,9 +1,39 @@ -using Microsoft.AspNetCore.Mvc.RazorPages; +using System; +using System.ComponentModel; +using System.ComponentModel.DataAnnotations; +using Microsoft.AspNetCore.Mvc.RazorPages; namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo.Pages.Components { public class FormsModel : PageModel { + [Required] + [DisplayName("Name")] + public string Name = "MyName"; + + [Required] + [EmailAddress] + [DisplayName("Email")] + public string EmailAddress = "info@volosoft.com"; + + [DisplayName("Password")] + [DataType(DataType.Password)] + public string Password = "MyPass"; + + [Phone] + [DisplayName("Phone Number")] + public string PhoneNumber = "05069231382"; + + [DisplayName("Count")] + public int Count = 42; + + [DataType(DataType.Date)] + [DisplayName("Day")] + public DateTime Day = DateTime.Today; + + [DisplayName("Is Active")] + public bool IsActive = true; + public void OnGet() {