Browse Source

Merge branch 'master' of https://github.com/aspnetzero/abp

pull/301/head
Halil İbrahim Kalkan 8 years ago
parent
commit
ad91d53cf5
  1. 1
      .gitignore
  2. 32
      src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpDynamicformTagHelperService.cs
  3. 12
      src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpRadioButton.cs
  4. 31
      src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpRadioInputTagHelper.cs
  5. 125
      src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpRadioInputTagHelperService.cs
  6. 2
      src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/SelectItems.cs
  7. 8
      src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/SelectType.cs
  8. 2196
      test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/Logs/logs.txt
  9. 4
      test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/Pages/Components/DynamicForms.cshtml
  10. 13
      test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/Pages/Components/DynamicForms.cshtml.cs

1
.gitignore

@ -262,3 +262,4 @@ src/MicroserviceDemo/MicroserviceDemo.TenancyService/Logs/*.txt
src/AbpDesk/Web_PlugIns/AbpDesk.MongoBlog.dll
/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/Logs/logs.txt
test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/Logs/logs.txt
test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/Logs/logs.txt

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

@ -142,13 +142,38 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form
}
protected virtual void ProcessSelectGroup(TagHelperContext context, TagHelperOutput output, ModelExpression model)
{
var abpSelectTagHelper = GetSelectGroupTagHelper(context, output, model);
RenderTagHelper(new TagHelperAttributeList(), context, abpSelectTagHelper, _htmlEncoder, "div", TagMode.StartTagAndEndTag);
}
protected virtual AbpTagHelper GetSelectGroupTagHelper(TagHelperContext context, TagHelperOutput output, ModelExpression model)
{
return IsRadioGroup(model.ModelExplorer) ?
GetAbpRadioInputTagHelper(model) :
GetSelectGroupTagHelper(model);
}
private AbpTagHelper GetSelectGroupTagHelper(ModelExpression model)
{
var abpSelectTagHelper = _serviceProvider.GetRequiredService<AbpSelectTagHelper>();
abpSelectTagHelper.AspFor = model;
abpSelectTagHelper.AspItems = null;
abpSelectTagHelper.ViewContext = TagHelper.ViewContext;
return abpSelectTagHelper;
}
RenderTagHelper(new TagHelperAttributeList(), context, abpSelectTagHelper, _htmlEncoder, "div", TagMode.StartTagAndEndTag);
private AbpTagHelper GetAbpRadioInputTagHelper(ModelExpression model)
{
var radioButtonAttribute = GetAttribute<AbpRadioButton>(model.ModelExplorer);
var abpRadioInputTagHelper = _serviceProvider.GetRequiredService<AbpRadioInputTagHelper>();
abpRadioInputTagHelper.AspFor = model;
abpRadioInputTagHelper.AspItems = null;
abpRadioInputTagHelper.Inline = radioButtonAttribute.Inline;
abpRadioInputTagHelper.Disabled = radioButtonAttribute.Disabled;
abpRadioInputTagHelper.ViewContext = TagHelper.ViewContext;
return abpRadioInputTagHelper;
}
protected virtual string ProcessSubmitButtonAndGetContent(TagHelperContext context, TagHelperOutput output)
@ -255,5 +280,10 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form
{
return GetAttribute<SelectItems>(explorer) != null;
}
protected virtual bool IsRadioGroup(ModelExplorer explorer)
{
return GetAttribute<AbpRadioButton>(explorer) != null;
}
}
}

12
src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpRadioButton.cs

@ -0,0 +1,12 @@
using System;
namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form
{
[AttributeUsage(AttributeTargets.Property)]
public class AbpRadioButton : Attribute
{
public bool Inline { get; set; } = false;
public bool Disabled { get; set; } = false;
}
}

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

@ -0,0 +1,31 @@
using System.Collections.Generic;
using JetBrains.Annotations;
using Microsoft.AspNetCore.Mvc.Rendering;
using Microsoft.AspNetCore.Mvc.ViewFeatures;
using Microsoft.AspNetCore.Razor.TagHelpers;
namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form
{
public class AbpRadioInputTagHelper : AbpTagHelper<AbpRadioInputTagHelper, AbpRadioInputTagHelperService>
{
public ModelExpression AspFor { get; set; }
public string Label { get; set; }
public bool? Inline { get; set; }
public bool? Disabled { get; set; }
public IEnumerable<SelectListItem> AspItems { get; set; }
[HtmlAttributeNotBound]
[ViewContext]
public ViewContext ViewContext { get; set; }
public AbpRadioInputTagHelper(AbpRadioInputTagHelperService tagHelperService)
: base(tagHelperService)
{
}
}
}

125
src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpRadioInputTagHelperService.cs

@ -0,0 +1,125 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using Microsoft.AspNetCore.Mvc.Rendering;
using Microsoft.AspNetCore.Mvc.ViewFeatures;
using Microsoft.AspNetCore.Razor.TagHelpers;
namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form
{
public class AbpRadioInputTagHelperService : AbpTagHelperService<AbpRadioInputTagHelper>
{
public override void Process(TagHelperContext context, TagHelperOutput output)
{
var selectItems = GetSelectItems(context,output);
var order = GetInputOrder(TagHelper.AspFor.ModelExplorer);
var html = GetHtml(context, output, selectItems);
AddGroupToFormGroupContents(context, TagHelper.AspFor.Name, html, order, out var surpress);
if (surpress)
{
output.SuppressOutput();
}
else
{
output.TagName = "div";
output.Attributes.Clear();
output.TagMode = TagMode.StartTagAndEndTag;
output.Content.SetHtmlContent(html);
}
}
protected virtual string GetHtml(TagHelperContext context, TagHelperOutput output, List<SelectListItem> selectItems)
{
var html = new StringBuilder("");
foreach (var selectItem in selectItems)
{
var inlineClass = (TagHelper.Inline ?? false) ? " custom-control-inline" : "";
var id = TagHelper.AspFor.Name + "Radio" + selectItem.Value;
var name = TagHelper.AspFor.Name;
var selected = selectItem.Selected ? " checked=\"checked\"" : "";
var disabled = (TagHelper.Disabled??false) ? " disabled" : "";
var htmlPart = "<div class=\"custom-control custom-radio" + inlineClass + "\">\r\n" +
" <input type=\"radio\" id=\"" + id + "\" name=\"" + name + "\" value=\"" + selectItem.Value + "\"" + selected + " class=\"custom-control-input\""+ disabled + ">\r\n" +
" <label class=\"custom-control-label\" for=\"" + id + "\">" + selectItem.Text + "</label>\r\n" +
"</div>";
html.AppendLine(htmlPart);
}
return html.ToString();
}
protected virtual List<SelectListItem> GetSelectItems(TagHelperContext context, TagHelperOutput output)
{
var selectItems = TagHelper.AspItems?.ToList();
if (TagHelper.AspItems == null &&
!GetSelectItemsIfProvidedByEnum(context, output, TagHelper.AspFor.ModelExplorer, out selectItems) &&
!GetSelectItemsIfProvidedFromAttribute(context, output, TagHelper.AspFor.ModelExplorer, out selectItems))
{
throw new Exception("No items provided for select attribute.");
}
SetSelectedValue(context, output, selectItems);
return selectItems;
}
protected virtual bool GetSelectItemsIfProvidedByEnum(TagHelperContext context, TagHelperOutput output, 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(TagHelperContext context, TagHelperOutput output, ModelExplorer explorer, out List<SelectListItem> selectItems)
{
selectItems = GetAttribute<SelectItems>(explorer)?.GetItems(explorer)?.ToList();
return selectItems != null;
}
protected virtual void SetSelectedValue(TagHelperContext context, TagHelperOutput output, List<SelectListItem> selectItems)
{
var selectedValue = GetSelectedValue(context, output);
if (!selectItems.Any(si => si.Selected))
{
var itemToBeSelected = selectItems.FirstOrDefault(si => si.Value.ToString() == selectedValue);
if (itemToBeSelected != null)
{
itemToBeSelected.Selected = true;
}
}
}
protected virtual string GetSelectedValue(TagHelperContext context, TagHelperOutput output)
{
if (TagHelper.AspFor.ModelExplorer.Metadata.IsEnum)
{
var baseType = TagHelper.AspFor.ModelExplorer.Model?.GetType().GetEnumUnderlyingType();
if (baseType == null)
{
return null;
}
var valueAsString = Convert.ChangeType(TagHelper.AspFor.ModelExplorer.Model, baseType);
return valueAsString != null ? valueAsString.ToString() : "";
}
return TagHelper.AspFor.ModelExplorer.Model?.ToString();
}
}
}

2
src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/SelectItems.cs

@ -11,8 +11,6 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form
{
public string ItemsListPropertyName { get; set; }
public SelectType SelectType { get; set; } = SelectType.Dropdown;
public IEnumerable<SelectListItem> GetItems(ModelExplorer explorer)
{
var properties = explorer.Container.Properties.Where(p => p.Metadata.PropertyName.Equals(ItemsListPropertyName)).ToList();

8
src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/SelectType.cs

@ -1,8 +0,0 @@
namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form
{
public enum SelectType
{
Dropdown,
Radio
}
}

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

File diff suppressed because it is too large

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

@ -12,7 +12,7 @@
<div class="demo-with-code">
<div class="demo-area">
<abp-dynamic-form abp-model="@Model.PersonInput" />
<abp-dynamic-form abp-model="@Model.PersonInput"/>
<hr />
<h5>Posted Values:</h5>
<div>
@ -37,7 +37,7 @@
<div class="demo-with-code">
<div class="demo-area">
<abp-dynamic-form abp-model="@Model.PersonInput">
<abp-input asp-for="@Model.PersonInput.Phone.Number"/>
<abp-input asp-for="@Model.PersonInput.Phone.Number" />
<abp-button button-type="Primary" type="submit" text="submit" />
</abp-dynamic-form>
<hr />

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

@ -13,11 +13,11 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo.Pages.Components
{
[BindProperty]
public PersonModel PersonInput { get; set; }
public List<SelectListItem> Countries { get; set; } = new List<SelectListItem>
{
new SelectListItem { Value = "CA", Text = "Canada"},
new SelectListItem { Value = "US", Text = "USA" },
new SelectListItem { Value = "US", Text = "USA"},
new SelectListItem { Value = "UK", Text = "United Kingdom"},
new SelectListItem { Value = "RU", Text = "Russia"}
};
@ -40,7 +40,7 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo.Pages.Components
public void OnPost()
{
}
public class PersonModel
@ -64,17 +64,14 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo.Pages.Components
[DisplayName("Day")]
[DisplayOrder(10003)]
public DateTime Day { get; set; }
[DisplayName("Is Active")]
public bool IsActive { get; set; }
[DisplayName("Country")]
[AbpRadioButton(Inline = true)]
[SelectItems(ItemsListPropertyName = nameof(Countries))]
public string Country { get; set; }
[DisplayName("Country")]
[SelectItems(ItemsListPropertyName = nameof(Countries))]
public IEnumerable<string> MultiCountry { get; set; }
}
public class PhoneModel

Loading…
Cancel
Save