Browse Source

Select Tag helper items refactoring

pull/279/head
yekalkan 8 years ago
parent
commit
9bfbf9da03
  1. 31
      src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpDynamicformTagHelperService.cs
  2. 51
      src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpSelectTagHelperService.cs
  3. 1075
      test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/Logs/logs.txt
  4. 184
      test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/Pages/Components/DynamicForms.cshtml

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

@ -59,7 +59,7 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form
Area = TagHelper.Area,
Page = TagHelper.Page,
PageHandler = TagHelper.PageHandler,
Antiforgery = TagHelper.Antiforgery,
Antiforgery = true,
Fragment = TagHelper.Fragment,
Route = TagHelper.Route,
Method = TagHelper.Method,
@ -100,7 +100,7 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form
protected virtual void SetSubmitButton(TagHelperContext context, TagHelperOutput output)
{
if (TagHelper.SubmitButton ?? false)
if (!TagHelper.SubmitButton ?? true)
{
return;
}
@ -123,9 +123,9 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form
foreach (var model in models)
{
if (IsSelectGroup(context, model, out var selectItems))
if (IsSelectGroup(context, model))
{
ProcessSelectGroup(context, model, selectItems);
ProcessSelectGroup(context, model);
continue;
}
@ -133,11 +133,11 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form
}
}
protected virtual void ProcessSelectGroup(TagHelperContext context, ModelExpression model, IEnumerable<SelectListItem> selectItems)
protected virtual void ProcessSelectGroup(TagHelperContext context, ModelExpression model)
{
var abpSelectTagHelper = _serviceProvider.GetRequiredService<AbpSelectTagHelper>();
abpSelectTagHelper.AspFor = model;
abpSelectTagHelper.AspItems = selectItems;
abpSelectTagHelper.AspItems = null;
abpSelectTagHelper.Label = "";
abpSelectTagHelper.ViewContext = TagHelper.ViewContext;
@ -230,28 +230,19 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form
return type == typeof(List<SelectListItem>) || type == typeof(IEnumerable<SelectListItem>);
}
protected virtual bool IsSelectGroup(TagHelperContext context, ModelExpression model, out IEnumerable<SelectListItem> selectItems)
protected virtual bool IsSelectGroup(TagHelperContext context, ModelExpression model)
{
return IsEnum(model.ModelExplorer, out selectItems) || AreSelectItemsProvided(model.ModelExplorer, out selectItems);
return IsEnum(model.ModelExplorer) || AreSelectItemsProvided(model.ModelExplorer);
}
protected virtual bool IsEnum(ModelExplorer explorer, out IEnumerable<SelectListItem> selectItems)
protected virtual bool IsEnum(ModelExplorer explorer)
{
selectItems = explorer.Metadata.IsEnum ? GetSelectItemsFromEnum(explorer.ModelType) : null;
return explorer.Metadata.IsEnum;
}
protected virtual IEnumerable<SelectListItem> GetSelectItemsFromEnum(Type enumType)
protected virtual bool AreSelectItemsProvided(ModelExplorer explorer)
{
return enumType.GetTypeInfo().GetMembers(BindingFlags.Public | BindingFlags.Static)
.Select((t, i) => new SelectListItem { Value = i.ToString(), Text = t.Name }).ToList();
}
protected virtual bool AreSelectItemsProvided(ModelExplorer explorer, out IEnumerable<SelectListItem> selectItems)
{
selectItems = GetAttribute<SelectItems>(explorer)?.GetItems(explorer, explorer.Model.ToString());
return selectItems != null;
return GetAttribute<SelectItems>(explorer) != null;
}
}
}

51
src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpSelectTagHelperService.cs

@ -1,8 +1,10 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text.Encodings.Web;
using Localization.Resources.AbpUi;
using Microsoft.AspNetCore.Mvc.Rendering;
using Microsoft.AspNetCore.Mvc.TagHelpers;
using Microsoft.AspNetCore.Mvc.ViewFeatures;
using Microsoft.AspNetCore.Razor.TagHelpers;
@ -31,7 +33,7 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form
var order = GetInputOrder(TagHelper.AspFor.ModelExplorer);
AddGroupToFormGroupContents(context, TagHelper.AspFor.Name, SurroundInnerHtmlAndGet(innerHtml), order, out var surpress);
if (surpress)
{
output.SuppressOutput();
@ -44,7 +46,7 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form
output.Content.SetHtmlContent(innerHtml);
}
}
protected virtual string GetFormInputGroupAsHtml(TagHelperContext context, TagHelperOutput output)
{
var selectTag = GetSelectTag(context);
@ -61,20 +63,29 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form
protected virtual TagHelperOutput GetSelectTag(TagHelperContext context)
{
var selectItems = TagHelper.AspItems?.ToList();
if (TagHelper.AspItems == null && !GetSelectItemsIfProvidedByEnum(TagHelper.AspFor.ModelExplorer, out selectItems) && !GetSelectItemsIfProvidedFromAttribute(TagHelper.AspFor.ModelExplorer, out selectItems))
{
throw new Exception("No items provided for select attribute.");
}
SetSelectedValue(TagHelper.AspFor.ModelExplorer.Model.ToString(), selectItems);
var selectTagHelper = new SelectTagHelper(_generator)
{
For = TagHelper.AspFor,
Items = TagHelper.AspItems,
Items = selectItems,
ViewContext = TagHelper.ViewContext
};
var inputTagHelperOutput = GetInnerTagHelper(new TagHelperAttributeList(), context,selectTagHelper, "select", TagMode.StartTagAndEndTag); ;
var inputTagHelperOutput = GetInnerTagHelper(new TagHelperAttributeList(), context, selectTagHelper, "select", TagMode.StartTagAndEndTag); ;
inputTagHelperOutput.Attributes.Add("class", "form-control");
return inputTagHelperOutput;
}
protected virtual string GetLabelAsHtml(TagHelperOutput selectTag)
{
if (string.IsNullOrEmpty(TagHelper.Label) && string.IsNullOrEmpty(TagHelper.AspFor.Metadata.DisplayName))
@ -91,5 +102,33 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form
TagHelper.AspFor.Metadata.DisplayName :
TagHelper.Label;
}
protected virtual bool GetSelectItemsIfProvidedByEnum(ModelExplorer explorer, out List<SelectListItem> selectItems)
{
selectItems = explorer.Metadata.IsEnum ? explorer.ModelType.GetTypeInfo().GetMembers(BindingFlags.Public | BindingFlags.Static)
.Select((t, i) => new SelectListItem { Value = i.ToString(), Text = t.Name }).ToList() : null;
return selectItems != null;
}
protected virtual bool GetSelectItemsIfProvidedFromAttribute(ModelExplorer explorer, out List<SelectListItem> selectItems)
{
selectItems = GetAttribute<SelectItems>(explorer)?.GetItems(explorer, explorer.Model.ToString())?.ToList();
return selectItems != null;
}
protected virtual void SetSelectedValue(string selectedValue, List<SelectListItem> selectItems)
{
if (!selectItems.Any(si => si.Selected))
{
var itemToBeSelected = selectItems.FirstOrDefault(si => si.Value.ToString() == selectedValue);
if (itemToBeSelected != null)
{
itemToBeSelected.Selected = true;
}
}
}
}
}

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

File diff suppressed because it is too large

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

@ -8,13 +8,11 @@
<h2>Dynamic Forms</h2>
<h4># Example</h4>
<h4># Dynamic Form Example</h4>
<div class="demo-with-code">
<div class="demo-area">
@*<abp-dynamic-form abp-model="@Model.PersonInput" asp-antiforgery="true" asp-controller="Demo" asp-action="Register">
<abp-input asp-for="@Model.PersonInput.Phone.Number" label="Phone Number" />
</abp-dynamic-form>
<abp-dynamic-form abp-model="@Model.PersonInput"/>
<hr />
<h5>Posted Values:</h5>
<div>
@ -25,119 +23,93 @@
Day: @Model.PersonInput.Day.ToString("yyyy-MM-dd") <br />
Country: @Model.PersonInput.Country <br />
IsActive: @Model.PersonInput.IsActive <br />
</div>*@
</div>
</div>
<div class="code-area">
<pre>
&lt;abp-dynamic-form abp-model=&quot;Model.PersonInput&quot; asp-antiforgery=&quot;true&quot;/&gt;
</pre>
</div>
</div>
<h4># Override an input Example</h4>
<form asp-antiforgery="true" asp-controller="Demo" asp-action="Register">
<abp-input asp-for="@Model.PersonInput.Phone.Number" label="Phone Number NO ABP-DYNAMİC-FORM" />
<abp-input asp-for="@Model.PersonInput.Name" label="Name NO ABP-DYNAMİC-FORM" />
</form>
<div class="demo-with-code">
<div class="demo-area">
<abp-dynamic-form abp-model="@Model.PersonInput">
<abp-input asp-for="@Model.PersonInput.Phone.Number" label="Phone Number" />
</abp-dynamic-form>
<hr />
<h5>Posted Values:</h5>
<div>
Name: @Model.PersonInput.Name <br />
City: @Model.PersonInput.City <br />
Phone.Name: @Model.PersonInput.Phone.Name <br />
Phone.Number: @Model.PersonInput.Phone.Number <br />
Day: @Model.PersonInput.Day.ToString("yyyy-MM-dd") <br />
Country: @Model.PersonInput.Country <br />
IsActive: @Model.PersonInput.IsActive <br />
</div>
</div>
<div class="code-area">
<pre>
&lt;abp-dynamic-form asp-model=&quot;Model.PersonInput&quot; &gt;
&lt;abp-dynamic-form abp-model=&quot;Model.PersonInput&quot;&gt;
&lt;abp-input asp-for=&quot;Model.PersonInput.Phone.Number&quot; label=&quot;Phone Number&quot; /&gt;
&lt;/abp-dynamic-form&gt;
</pre>
</div>
</div>
<h4># Form with Button Example</h4>
@*<h4># Input Group Example</h4>
<div class="demo-with-code">
<div class="demo-area">
<form method="post" action="#">
<abp-input asp-for="@Model.Name" />
<abp-input asp-for="@Model.Password" label="Password" />
<abp-input asp-for="@Model.IsActive" />
<abp-input asp-for="@Model.PhoneNumber" />
<abp-input asp-for="@Model.EmailAddress" />
<abp-input asp-for="@Model.Count" />
<abp-input asp-for="@Model.Day" />
<abp-select asp-for="@Model.Country" asp-items="@Model.Countries" label="Country"></abp-select>
<abp-select asp-for="@Model.City" asp-items="@Html.GetEnumSelectList(typeof(Cities))"></abp-select>
</form>
</div>
<div class="code-area">
<pre>
&lt;form method=&quot;post&quot; action=&quot;#&quot;&gt;
&lt;abp-input asp-for=&quot;Model.Name&quot;/&gt;
&lt;abp-input asp-for=&quot;Model.Password&quot; label=&quot;Password&quot;/&gt;
&lt;abp-input asp-for=&quot;Model.IsActive&quot; /&gt;
&lt;abp-input asp-for=&quot;Model.PhoneNumber&quot; /&gt;
&lt;abp-input asp-for=&quot;Model.EmailAddress&quot; /&gt;
&lt;abp-input asp-for=&quot;Model.Count&quot; /&gt;
&lt;abp-input asp-for=&quot;Model.Day&quot; /&gt;
&lt;abp-select asp-for=&quot;Model.Country&quot; asp-items=&quot;Model.Countries&quot; label=&quot;Country&quot;&gt;&lt;/abp-select&gt;
&lt;abp-select asp-for=&quot;Model.City&quot; asp-items=&quot;Html.GetEnumSelectList(typeof(Cities))&quot;&gt;&lt;/abp-select&gt;
&lt;/form&gt;
</pre>
<div class="demo-with-code">
<div class="demo-area">
<abp-dynamic-form abp-model="@Model.PersonInput" submit-button="true"/>
<hr />
<h5>Posted Values:</h5>
<div>
Name: @Model.PersonInput.Name <br />
City: @Model.PersonInput.City <br />
Phone.Name: @Model.PersonInput.Phone.Name <br />
Phone.Number: @Model.PersonInput.Phone.Number <br />
Day: @Model.PersonInput.Day.ToString("yyyy-MM-dd") <br />
Country: @Model.PersonInput.Country <br />
IsActive: @Model.PersonInput.IsActive <br />
</div>
</div>*@
</div>
<div class="code-area">
<pre>
&lt;abp-dynamic-form abp-model=&quot;Model.PersonInput&quot; submit-button=&quot;true&quot;/&gt;
</pre>
</div>
</div>
@*<div class="demo-with-code">
<div class="demo-area">
<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>
</div>
<div class="code-area">
<pre>
&lt;form method=&quot;post&quot; action=&quot;#&quot;&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-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.Name&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.PhoneNumber&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.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>
<h4># Non-dynamic Form </h4>
<div class="demo-with-code">
<div class="demo-area">
<form method="post">
<abp-input asp-for="@Model.PersonInput.Name"/>
<abp-select asp-for="@Model.PersonInput.Country" label="Where Do you live?"/>
<abp-input asp-for="@Model.PersonInput.Phone.Number"/>
</form>
<hr />
<h5>Posted Values:</h5>
<div>
Name: @Model.PersonInput.Name <br />
Country: @Model.PersonInput.Country <br />
Phone.Number: @Model.PersonInput.Phone.Number <br />
</div>
</div>*@
</div>
<div class="code-area">
<pre>
&lt;form method=&quot;post&quot;&gt;
&lt;abp-input asp-for=&quot;Model.PersonInput.Name&quot;/&gt;
&lt;abp-input asp-for=&quot;Model.PersonInput.Country&quot; label=&quot;Where Do you live?&quot;/&gt;
&lt;abp-input asp-for=&quot;Model.PersonInput.Phone.Number&quot;/&gt;
&lt;/form&gt;
</pre>
</div>
</div>

Loading…
Cancel
Save