/
AureliaEnhanceTagHelper.cs
75 lines (67 loc) · 2.15 KB
/
AureliaEnhanceTagHelper.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
using FooBar.Web.Core.Helpers;
using FooBar.Web.Core.Json;
using Microsoft.AspNetCore.Razor.TagHelpers;
using System;
namespace FooBar.Web.TagHelpers
{
[HtmlTargetElement(Attributes = AuEnhanceAttributeName)]
[HtmlTargetElement(Attributes = AuModuleAttributeName)]
public class AureliaEnhanceTagHelper : TagHelper
{
private const string HtmlIdAttributeName = "id";
private const string AuEnhanceAttributeName = "th-aurelia-enhance";
[HtmlAttributeName(AuEnhanceAttributeName)]
public bool Enhance { get; set; }
private const string AuModuleAttributeName = "th-aurelia-enhance-module";
[HtmlAttributeName(AuModuleAttributeName)]
public string Module { get; set; }
private const string AuDataAttributeName = "th-aurelia-enhance-data";
[HtmlAttributeName(AuDataAttributeName)]
public object Data { get; set; }
public override void Process(TagHelperContext context, TagHelperOutput output)
{
Enhance = !String.IsNullOrEmpty(Module);
if (!Enhance)
{
return;
}
string elementId;
if (!output.Attributes.ContainsName(HtmlIdAttributeName))
{
elementId = StringHelpers.RandomString(8);
output.Attributes.SetAttribute(HtmlIdAttributeName, elementId);
}
else
{
elementId = Convert.ToString(output.Attributes[HtmlIdAttributeName].Value);
}
if(!String.IsNullOrEmpty(Module))
{
string jsonData = "{}";
if (Data != null)
{
jsonData = Data.ToJsonCamelCase();
}
output.PostElement.AppendHtml($@"
<script>
SystemJS.import('app/core/aurelia-enhancer').then(function(enhancer) {{
SystemJS.import('{Module}').then(function(module) {{
var data = {jsonData};
var clientModel = module.create(data);
enhancer.enhance(clientModel, document.getElementById('{elementId}'));
}});
}});
</script>");
}
else
{
output.PostElement.AppendHtml($@"
<script>
SystemJS.import('app/core/aurelia-enhancer').then(function(enhancer) {{
enhancer.enhance({{}}, document.getElementById('{elementId}'));
}});
</script>");
}
}
}
}