-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathFormComponent.razor.cs
101 lines (91 loc) · 3.65 KB
/
FormComponent.razor.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
using Microsoft.AspNetCore.Components;
using MatBlazor;
using System.Reflection;
using Blazor.FormBuilderComponent.Extensions;
namespace Blazor.FormBuilderComponent
{
public partial class FormComponent
{
private object? _dataContext;
// Object model
[Parameter]
public object? DataContext
{
get => _dataContext;
set
{
_dataContext = value;
if (_dataContext != null)
Properties = _dataContext.GetType().GetProperties();
}
}
// Event target
[Parameter]
public ComponentBase? EventTarget { get; set; }
// List of properties to render
public PropertyInfo[] Properties { get; set; } = new PropertyInfo[] { };
/// <summary>
/// Construct a form fragement using reflected property
/// </summary>
/// <param name="model"></param>
/// <returns></returns>
public RenderFragment RenderFormElement(PropertyInfo prp) => builder =>
{
ArgumentNullException.ThrowIfNull(EventTarget);
ArgumentNullException.ThrowIfNull(DataContext);
ArgumentNullException.ThrowIfNull(prp);
switch (prp.PropertyType.Name)
{
case nameof(String):
builder.CreateComponent<MatTextField<string>, string>(EventTarget, DataContext, prp);
break;
case nameof(DateTime):
builder.CreateComponent<MatDatePicker<DateTime>, DateTime>(EventTarget, DataContext, prp);
break;
case nameof(Int32):
builder.CreateComponent<MatNumericUpDownField<int>, int>(EventTarget, DataContext, prp);
break;
case nameof(Decimal):
builder.CreateComponent<MatNumericUpDownField<decimal>, decimal>(EventTarget, DataContext, prp);
break;
default:
if (prp.PropertyType.BaseType == typeof(Enum))
{
// When using reflection to call a generic method, we must first use reflection to get the method itself
MethodInfo method = typeof(FormBuilderExtensions).GetMethod(nameof(FormBuilderExtensions.CreateEnumComponent));
MethodInfo generic = method.MakeGenericMethod(prp.PropertyType);
generic.Invoke(null, new object[] { builder, EventTarget, DataContext, prp });
}
else
{
builder.CreateComponent<MatTextField<string>, string>(EventTarget, DataContext, prp);
}
break;
}
};
/// <summary>
/// Construct a form ValidationMessage using reflected property
/// </summary>
/// <param name="prp"></param>
/// <returns></returns>
public RenderFragment RenderValidationElement(PropertyInfo prp) => builder =>
{
ArgumentNullException.ThrowIfNull(DataContext);
ArgumentNullException.ThrowIfNull(prp);
builder.CreateValidationComponent(DataContext, prp);
};
/// <summary>
/// Get DataContext instance value for reflected property
/// </summary>
/// <param name="fieldName"></param>
/// <returns></returns>
public object this[PropertyInfo property]
{
get
{
return property.GetValue(DataContext);
}
}
//public EventCallback<EditContext> OnSubmit { get; set; }
}
}