This repository has been archived by the owner on Dec 14, 2018. It is now read-only.
/
FormContext.cs
149 lines (132 loc) · 5.69 KB
/
FormContext.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
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using System.Collections.Generic;
using Microsoft.AspNetCore.Html;
namespace Microsoft.AspNetCore.Mvc.ViewFeatures
{
/// <summary>
/// Information about the current <form>.
/// </summary>
/// <remarks>
/// Literal <form> elements in a view will share the default <see cref="FormContext"/> instance unless tag
/// helpers are enabled.
/// </remarks>
public class FormContext
{
private Dictionary<string, bool> _renderedFields;
private Dictionary<string, object> _formData;
private IList<IHtmlContent> _endOfFormContent;
/// <summary>
/// Gets a property bag for any information you wish to associate with a <form/> in an
/// <see cref="Rendering.IHtmlHelper"/> implementation or extension method.
/// </summary>
public IDictionary<string, object> FormData
{
get
{
if (_formData == null)
{
_formData = new Dictionary<string, object>(StringComparer.Ordinal);
}
return _formData;
}
}
/// <summary>
/// Gets or sets an indication the current <form> element contains an antiforgery token. Do not use
/// unless <see cref="CanRenderAtEndOfForm"/> is <c>true</c>.
/// </summary>
/// <value>
/// <c>true</c> if the current <form> element contains an antiforgery token; <c>false</c> otherwise.
/// </value>
public bool HasAntiforgeryToken { get; set; }
/// <summary>
/// Gets an indication the <see cref="FormData"/> property bag has been used and likely contains entries.
/// </summary>
/// <value>
/// <c>true</c> if the backing field for <see cref="FormData"/> is non-<c>null</c>; <c>false</c> otherwise.
/// </value>
public bool HasFormData => _formData != null;
/// <summary>
/// Gets an indication the <see cref="EndOfFormContent"/> collection has been used and likely contains entries.
/// </summary>
/// <value>
/// <c>true</c> if the backing field for <see cref="EndOfFormContent"/> is non-<c>null</c>; <c>false</c>
/// otherwise.
/// </value>
public bool HasEndOfFormContent => _endOfFormContent != null;
/// <summary>
/// Gets an <see cref="IHtmlContent"/> collection that should be rendered just prior to the next </form>
/// end tag. Do not use unless <see cref="CanRenderAtEndOfForm"/> is <c>true</c>.
/// </summary>
public IList<IHtmlContent> EndOfFormContent
{
get
{
if (_endOfFormContent == null)
{
_endOfFormContent = new List<IHtmlContent>();
}
return _endOfFormContent;
}
}
/// <summary>
/// Gets or sets an indication whether extra content can be rendered at the end of the content of this
/// <form> element. That is, <see cref="EndOfFormContent"/> will be rendered just prior to the
/// </form> end tag.
/// </summary>
/// <value>
/// <c>true</c> if the framework will render <see cref="EndOfFormContent"/>; <c>false</c> otherwise. In
/// particular, <c>true</c> if the current <form> is associated with a tag helper or will be generated by
/// an HTML helper; <c>false</c> when using the default <see cref="FormContext"/> instance.
/// </value>
public bool CanRenderAtEndOfForm { get; set; }
/// <summary>
/// Gets a dictionary mapping full HTML field names to indications that the named field has been rendered in
/// this <form>.
/// </summary>
private Dictionary<string, bool> RenderedFields
{
get
{
if (_renderedFields == null)
{
_renderedFields = new Dictionary<string, bool>(StringComparer.Ordinal);
}
return _renderedFields;
}
}
/// <summary>
/// Returns an indication based on <see cref="RenderedFields"/> that the given <paramref name="fieldName"/> has
/// been rendered in this <form>.
/// </summary>
/// <param name="fieldName">The full HTML name of a field that may have been rendered.</param>
/// <returns>
/// <c>true</c> if the given <paramref name="fieldName"/> has been rendered; <c>false</c> otherwise.
/// </returns>
public bool RenderedField(string fieldName)
{
if (fieldName == null)
{
throw new ArgumentNullException(nameof(fieldName));
}
bool result;
RenderedFields.TryGetValue(fieldName, out result);
return result;
}
/// <summary>
/// Updates <see cref="RenderedFields"/> to indicate <paramref name="fieldName"/> has been rendered in this
/// <form>.
/// </summary>
/// <param name="fieldName">The full HTML name of a field that may have been rendered.</param>
/// <param name="value">If <c>true</c>, the given <paramref name="fieldName"/> has been rendered.</param>
public void RenderedField(string fieldName, bool value)
{
if (fieldName == null)
{
throw new ArgumentNullException(nameof(fieldName));
}
RenderedFields[fieldName] = value;
}
}
}