Browse Source

Select Tag Helper

pull/272/head
yekalkan 9 years ago
parent
commit
8d2c68837e
  1. 8
      src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/AbpTagHelperService.cs
  2. 14
      src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpInputTagHelperService.cs
  3. 25
      src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpSelectTagHelper.cs
  4. 45
      src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpSelectTagHelperService.cs
  5. 57
      test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/Pages/Components/Forms.cshtml
  6. 40
      test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/Pages/Components/Forms.cshtml.cs

8
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; 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<TagHelperContent>(() => new DefaultTagHelperContent())) var innerOutput = new TagHelperOutput(tagName, attributeList, (useCachedResult, encoder) => Task.Run<TagHelperContent>(() => new DefaultTagHelperContent()))
{ {
TagMode = TagMode.SelfClosing TagMode = tagMode
}; };
var innerContext = new TagHelperContext(attributeList, new Dictionary<object, object>(), Guid.NewGuid().ToString()); var innerContext = new TagHelperContext(attributeList, new Dictionary<object, object>(), Guid.NewGuid().ToString());
@ -44,11 +44,11 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers
return innerOutput; 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<TagHelperContent>(() => new DefaultTagHelperContent())) var innerOutput = new TagHelperOutput(tagName, attributeList, (useCachedResult, encoder) => Task.Run<TagHelperContent>(() => new DefaultTagHelperContent()))
{ {
TagMode = TagMode.SelfClosing TagMode = tagMode
}; };
var innerContext = new TagHelperContext(attributeList, new Dictionary<object, object>(), Guid.NewGuid().ToString()); var innerContext = new TagHelperContext(attributeList, new Dictionary<object, object>(), Guid.NewGuid().ToString());

14
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.Text.Encodings.Web;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc.Rendering; using Microsoft.AspNetCore.Mvc.Rendering;
@ -11,12 +12,10 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form
{ {
public class AbpInputTagHelperService : AbpTagHelperService<AbpInputTagHelper> public class AbpInputTagHelperService : AbpTagHelperService<AbpInputTagHelper>
{ {
private readonly HtmlEncoder _htmlEncoder;
private readonly IHtmlGenerator _generator; private readonly IHtmlGenerator _generator;
public AbpInputTagHelperService(HtmlEncoder htmlEncoder, IHtmlGenerator generator) public AbpInputTagHelperService(IHtmlGenerator generator)
{ {
_htmlEncoder = htmlEncoder;
_generator = generator; _generator = generator;
} }
@ -29,18 +28,19 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form
protected virtual void ProcessAttributes(TagHelperOutput output) protected virtual void ProcessAttributes(TagHelperOutput output)
{ {
var inputTagHelperOutput = GetAttributes(); output.Attributes.RemoveAll("asp-for");
var inputTagHelperOutput = GetAttributes(output);
foreach (var tagHelperAttribute in inputTagHelperOutput.Attributes) foreach (var tagHelperAttribute in inputTagHelperOutput.Attributes)
{ {
output.Attributes.Add(tagHelperAttribute); output.Attributes.Add(tagHelperAttribute);
} }
output.Attributes.RemoveAll("asp-for");
output.Attributes.Add("class", "form-control"); output.Attributes.Add("class", "form-control");
} }
protected virtual TagHelperOutput GetAttributes() protected virtual TagHelperOutput GetAttributes(TagHelperOutput output)
{ {
var inputTagHelper = new InputTagHelper(_generator) var inputTagHelper = new InputTagHelper(_generator)
{ {

25
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<AbpSelectTagHelper, AbpSelectTagHelperService>, ITransientDependency
{
public ModelExpression AspFor { get; set; }
public IEnumerable<SelectListItem> AspItems { get; set; }
[HtmlAttributeNotBound]
[ViewContext]
public ViewContext ViewContext { get; set; }
public AbpSelectTagHelper(AbpSelectTagHelperService tagHelperService)
: base(tagHelperService)
{
}
}
}

45
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<AbpSelectTagHelper>
{
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);
}
}
}

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

@ -1,4 +1,5 @@
@page @page
@using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo.Pages.Components
@model Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo.Pages.Components.FormsModel @model Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo.Pages.Components.FormsModel
@{ @{
ViewData["Title"] = "Forms"; ViewData["Title"] = "Forms";
@ -13,6 +14,12 @@
<div class="demo-with-code"> <div class="demo-with-code">
<div class="demo-area"> <div class="demo-area">
<form method="post" action="#"> <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-form-group>
<abp-input asp-for="@Model.Name" /> <abp-input asp-for="@Model.Name" />
</abp-form-group> </abp-form-group>
@ -38,27 +45,35 @@
</div> </div>
<div class="code-area"> <div class="code-area">
<pre> <pre>
&lt;abp-form-group&gt; &lt;form method=&quot;post&quot; action=&quot;#&quot;&gt;
&lt;abp-input asp-for=&quot;@Model.Name&quot; /&gt; &lt;abp-form-group&gt;
&lt;/abp-form-group&gt; &lt;abp-select asp-for=&quot;@Model.Country&quot; asp-items=&quot;@Model.Countries&quot;&gt;&lt;/abp-select&gt;
&lt;abp-form-group&gt; &lt;/abp-form-group&gt;
&lt;abp-input asp-for=&quot;@Model.Password&quot; /&gt; &lt;abp-form-group&gt;
&lt;/abp-form-group&gt; &lt;abp-select asp-for=&quot;@Model.City&quot; asp-items=&quot;@Html.GetEnumSelectList(typeof(Cities))&quot;&gt;&lt;/abp-select&gt;
&lt;abp-form-group&gt; &lt;/abp-form-group&gt;
&lt;abp-input asp-for=&quot;@Model.PhoneNumber&quot; /&gt; &lt;abp-form-group&gt;
&lt;/abp-form-group&gt; &lt;abp-input asp-for=&quot;@Model.Name&quot; /&gt;
&lt;abp-form-group&gt; &lt;/abp-form-group&gt;
&lt;abp-input asp-for=&quot;@Model.EmailAddress&quot; /&gt; &lt;abp-form-group&gt;
&lt;/abp-form-group&gt; &lt;abp-input asp-for=&quot;@Model.Password&quot; /&gt;
&lt;abp-form-group&gt; &lt;/abp-form-group&gt;
&lt;abp-input asp-for=&quot;@Model.Count&quot; /&gt; &lt;abp-form-group&gt;
&lt;/abp-form-group&gt; &lt;abp-input asp-for=&quot;@Model.PhoneNumber&quot; /&gt;
&lt;abp-form-group&gt; &lt;/abp-form-group&gt;
&lt;abp-input asp-for=&quot;@Model.Day&quot; /&gt; &lt;abp-form-group&gt;
&lt;/abp-form-group&gt; &lt;abp-input asp-for=&quot;@Model.EmailAddress&quot; /&gt;
&lt;abp-form-group&gt; &lt;/abp-form-group&gt;
&lt;abp-input asp-for=&quot;@Model.IsActive&quot; /&gt; &lt;abp-form-group&gt;
&lt;/abp-form-group&gt; &lt;abp-input asp-for=&quot;@Model.Count&quot; /&gt;
&lt;/abp-form-group&gt;
&lt;abp-form-group&gt;
&lt;abp-input asp-for=&quot;@Model.Day&quot; /&gt;
&lt;/abp-form-group&gt;
&lt;abp-form-group&gt;
&lt;abp-input asp-for=&quot;@Model.IsActive&quot; /&gt;
&lt;/abp-form-group&gt;
&lt;/form&gt;
</pre> </pre>
</div> </div>
</div> </div>

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

@ -1,7 +1,10 @@
using System; using System;
using System.Collections.Generic;
using System.ComponentModel; using System.ComponentModel;
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using Microsoft.AspNetCore.Mvc.RazorPages; 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 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] [Required]
[DisplayName("Name")] [DisplayName("Name")]
public string Name = "MyName"; public string Name { get; set; }
[Required] [Required]
[EmailAddress] [EmailAddress]
[DisplayName("Email")] [DisplayName("Email")]
public string EmailAddress = "info@volosoft.com"; public string EmailAddress { get; set; }
[DisplayName("Password")]
[DataType(DataType.Password)] [DataType(DataType.Password)]
public string Password = "MyPass"; public string Password { get; set; } = "MyPass";
[Phone] [Phone]
[DisplayName("Phone Number")] [DisplayName("Phone Number")]
public string PhoneNumber = "05069231382"; public string PhoneNumber { get; set; }
[DisplayName("Count")] [DisplayName("Count")]
public int Count = 42; public int Count { get; set; }
[DataType(DataType.Date)] [DataType(DataType.Date)]
[DisplayName("Day")] [DisplayName("Day")]
public DateTime Day = DateTime.Today; public DateTime Day { get; set; }
[DisplayName("Is Active")] [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<SelectListItem> Countries { get; } = new List<SelectListItem>
{
new SelectListItem { Value = "MX", Text = "Mexico" },
new SelectListItem { Value = "CA", Text = "Canada" },
new SelectListItem { Value = "US", Text = "USA" },
};
public void OnGet() public void OnGet()
{ {
Name = "MyName";
Day = DateTime.Today;
} }
} }
public enum Cities
{
Istanbul,
NewJersey,
Moscow
}
} }
Loading…
Cancel
Save