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 87c01534f7..9569468bd2 100644 --- a/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/AbpTagHelperService.cs +++ b/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/AbpTagHelperService.cs @@ -30,11 +30,11 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers return Task.CompletedTask; } - protected TagHelperOutput GetInnerTagHelper(TagHelperAttributeList attributeList, TagHelper tagHelper, string tagName = "div") + protected TagHelperOutput GetInnerTagHelper(TagHelperAttributeList attributeList, TagHelper tagHelper, string tagName = "div", TagMode tagMode = TagMode.SelfClosing) { var innerOutput = new TagHelperOutput(tagName, attributeList, (useCachedResult, encoder) => Task.Run(() => new DefaultTagHelperContent())) { - TagMode = TagMode.SelfClosing + TagMode = tagMode }; var innerContext = new TagHelperContext(attributeList, new Dictionary(), Guid.NewGuid().ToString()); @@ -44,11 +44,11 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers return innerOutput; } - protected string RenderTagHelper(TagHelperAttributeList attributeList, TagHelper tagHelper, HtmlEncoder htmlEncoder, string tagName = "div") + protected string RenderTagHelper(TagHelperAttributeList attributeList, TagHelper tagHelper, HtmlEncoder htmlEncoder, string tagName = "div", TagMode tagMode = TagMode.SelfClosing) { var innerOutput = new TagHelperOutput(tagName, attributeList, (useCachedResult, encoder) => Task.Run(() => new DefaultTagHelperContent())) { - TagMode = TagMode.SelfClosing + TagMode = tagMode }; var innerContext = new TagHelperContext(attributeList, new Dictionary(), Guid.NewGuid().ToString()); 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 d5a726ffe3..6a0c161ae2 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,4 +1,5 @@ -using System.Text; +using System.Linq; +using System.Text; using System.Text.Encodings.Web; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc.Rendering; @@ -11,12 +12,10 @@ 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) + public AbpInputTagHelperService(IHtmlGenerator generator) { - _htmlEncoder = htmlEncoder; _generator = generator; } @@ -29,18 +28,19 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form protected virtual void ProcessAttributes(TagHelperOutput output) { - var inputTagHelperOutput = GetAttributes(); + output.Attributes.RemoveAll("asp-for"); + + var inputTagHelperOutput = GetAttributes(output); 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() + protected virtual TagHelperOutput GetAttributes(TagHelperOutput output) { var inputTagHelper = new InputTagHelper(_generator) { diff --git a/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpSelectTagHelper.cs b/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpSelectTagHelper.cs new file mode 100644 index 0000000000..a7285aa233 --- /dev/null +++ b/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpSelectTagHelper.cs @@ -0,0 +1,25 @@ +using System.Collections.Generic; +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 AbpSelectTagHelper : AbpTagHelper, ITransientDependency + { + public ModelExpression AspFor { get; set; } + + public IEnumerable AspItems { get; set; } + + [HtmlAttributeNotBound] + [ViewContext] + public ViewContext ViewContext { get; set; } + + public AbpSelectTagHelper(AbpSelectTagHelperService tagHelperService) + : base(tagHelperService) + { + + } + } +} diff --git a/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpSelectTagHelperService.cs b/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpSelectTagHelperService.cs new file mode 100644 index 0000000000..b132d77e75 --- /dev/null +++ b/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpSelectTagHelperService.cs @@ -0,0 +1,45 @@ +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; + +namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form +{ + public class AbpSelectTagHelperService : AbpTagHelperService + { + private readonly IHtmlGenerator _generator; + private readonly HtmlEncoder _encoder; + + public AbpSelectTagHelperService(IHtmlGenerator generator, HtmlEncoder encoder) + { + _generator = generator; + _encoder = encoder; + } + + public override void Process(TagHelperContext context, TagHelperOutput output) + { + output.TagName = "div"; + output.Attributes.Add("class", "form-control"); + output.TagMode = TagMode.StartTagAndEndTag; + + output.Content.SetHtmlContent(GetInnerHtml(output)); + output.Attributes.Clear(); + } + + protected virtual string GetInnerHtml(TagHelperOutput output) + { + var selectTagHelper = new SelectTagHelper(_generator) + { + For = TagHelper.AspFor, + Items = TagHelper.AspItems, + ViewContext = TagHelper.ViewContext + }; + + return RenderTagHelper(output.Attributes, selectTagHelper, _encoder, "select", TagMode.StartTagAndEndTag); + } + } +} \ 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 748f01f983..8df0e4440a 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 @@ -1,4 +1,5 @@ @page +@using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo.Pages.Components @model Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo.Pages.Components.FormsModel @{ ViewData["Title"] = "Forms"; @@ -13,6 +14,12 @@
+ + + + + + @@ -38,27 +45,35 @@
       
-        <abp-form-group>
-            <abp-input asp-for="@Model.Name" />
-        </abp-form-group>
-        <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>
+        <form method="post" action="#">
+            <abp-form-group>
+                <abp-select asp-for="@Model.Country" asp-items="@Model.Countries"></abp-select>
+            </abp-form-group>
+            <abp-form-group>
+                <abp-select asp-for="@Model.City" asp-items="@Html.GetEnumSelectList(typeof(Cities))"></abp-select>
+            </abp-form-group>
+            <abp-form-group>
+                <abp-input asp-for="@Model.Name" />
+            </abp-form-group>
+            <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>
+        </form>
         
\ 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 fcc8347a99..675f4a5839 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,7 +1,10 @@ using System; +using System.Collections.Generic; using System.ComponentModel; using System.ComponentModel.DataAnnotations; using Microsoft.AspNetCore.Mvc.RazorPages; +using Microsoft.AspNetCore.Mvc.Rendering; +using Microsoft.AspNetCore.Mvc.ViewFeatures; namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo.Pages.Components { @@ -9,34 +12,55 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo.Pages.Components { [Required] [DisplayName("Name")] - public string Name = "MyName"; + public string Name { get; set; } [Required] [EmailAddress] [DisplayName("Email")] - public string EmailAddress = "info@volosoft.com"; + public string EmailAddress { get; set; } - [DisplayName("Password")] [DataType(DataType.Password)] - public string Password = "MyPass"; + public string Password { get; set; } = "MyPass"; [Phone] [DisplayName("Phone Number")] - public string PhoneNumber = "05069231382"; + public string PhoneNumber { get; set; } [DisplayName("Count")] - public int Count = 42; + public int Count { get; set; } [DataType(DataType.Date)] [DisplayName("Day")] - public DateTime Day = DateTime.Today; + public DateTime Day { get; set; } [DisplayName("Is Active")] - public bool IsActive = true; + public bool IsActive { get; set; } + + [DisplayName("Country")] + public string Country { get; set; } + + [DisplayName("City")] + public Cities City { get; set; } + + public List Countries { get; } = new List + { + new SelectListItem { Value = "MX", Text = "Mexico" }, + new SelectListItem { Value = "CA", Text = "Canada" }, + new SelectListItem { Value = "US", Text = "USA" }, + }; public void OnGet() { + Name = "MyName"; + Day = DateTime.Today; } } + + public enum Cities + { + Istanbul, + NewJersey, + Moscow + } } \ No newline at end of file