-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathHtmlHelperExtensions.cs
78 lines (69 loc) · 3.25 KB
/
HtmlHelperExtensions.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
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Linq.Expressions;
using System.Reflection;
using System.Web;
using System.Web.Mvc;
namespace CharacterSpy.Web.Extensions
{
public static class HtmlHelperExtensions
{
public static IHtmlString CharacterCountOf<TModel, TProperty>(
this HtmlHelper<TModel> htmlHelper,
Func<Expression<Func<TModel, TProperty>>, object, IHtmlString> helperMethod,
Expression<Func<TModel, TProperty>> expression,
object htmlAttributes)
{
var methodResult = helperMethod(expression, htmlAttributes);
var markedResult = methodResult.MarkTarget();
return BuildCharacterWatcher(markedResult.Item1, expression, markedResult.Item2);
}
public static IHtmlString CharacterCountOf<TModel, TProperty>(
this HtmlHelper<TModel> htmlHelper,
Func<Expression<Func<TModel, TProperty>>, object, string, IHtmlString> helperMethod,
Expression<Func<TModel, TProperty>> expression,
object htmlAttributes,
string optionalParameterOne = null)
{
var methodResult = helperMethod(expression, htmlAttributes, optionalParameterOne);
var markedResult = methodResult.MarkTarget();
return BuildCharacterWatcher(markedResult.Item1, expression, markedResult.Item2);
}
private static Tuple<IHtmlString, string> MarkTarget(this IHtmlString generatedHtmlTag)
{
var targetIdentifier = Guid.NewGuid().ToString();
var tagString = generatedHtmlTag.ToString();
var markedString = tagString.Insert(tagString.IndexOf(" ", StringComparison.CurrentCulture), $" {targetIdentifier} ");
var markedTag = new HtmlString(markedString);
return new Tuple<IHtmlString, string>(markedTag, targetIdentifier);
}
private static IHtmlString BuildCharacterWatcher<TModel, TProperty>(
IHtmlString methodResult,
Expression<Func<TModel, TProperty>> expression,
string targetIdentifier)
{
var memberExpression = expression.Body as MemberExpression;
if (memberExpression == null)
{
return methodResult;
}
var propertyInfo = (PropertyInfo)memberExpression.Member;
var attribute = propertyInfo.GetCustomAttribute<StringLengthAttribute>();
if (attribute == null || attribute.MaximumLength <= 5)
{
return methodResult;
}
var watchId = Guid.NewGuid().ToString();
var tag1 = new TagBuilder("span");
tag1.Attributes.Add("class", "text-content-max-length-countdown");
tag1.Attributes.Add("id", watchId);
var tag2 = new TagBuilder("script");
tag2.Attributes.Add("type", "text/javascript");
tag2.InnerHtml =
$"$(function(){{initCountdownWatcher('[{targetIdentifier}]', '#{watchId}', {attribute.MaximumLength});}});";
return new HtmlString(methodResult.ToString() + tag1 + tag2);
}
}
}