Copy CodePlex #1836 and #1878 fixes over (Fix #296).

This change enables user to specify the tag for the wrapping HTML element
generated from ValidationSummary() and ValidationMessage[For]().

Clean up HtmlHelperValidationExtensions.
This commit is contained in:
Tian Pan 2014-05-13 20:33:58 -07:00
parent 6082cd9f36
commit a6d89c4482
7 changed files with 200 additions and 50 deletions

View File

@ -15,9 +15,9 @@
<section class="validationSummary">
@Html.ValidationSummary()
@Html.ValidationSummary(excludePropertyErrors: true)
@Html.ValidationSummary(message: "Hello from validation message summary 1.")
@Html.ValidationSummary(message: "Hello from validation message summary 1.", tag: "h2")
@Html.ValidationSummary(excludePropertyErrors: true, message: "Hello from validation message summary 2")
@Html.ValidationSummary(message: "Hello from validation message summary 3", htmlAttributes: new { style = "color: red" })
@Html.ValidationSummary(excludePropertyErrors: true, message: "Hello from validation message summary 4", htmlAttributes: new { style = "color: green" })
@Html.ValidationSummary(message: "Hello from validation message summary 5", htmlAttributes: new Dictionary<string, object> { { "style", "color: blue" } })
@Html.ValidationSummary(message: "Hello from validation message summary 5", htmlAttributes: new Dictionary<string, object> { { "style", "color: blue" } }, tag: "h1")
</section>

View File

@ -443,13 +443,16 @@ namespace Microsoft.AspNet.Mvc.Rendering
}
/// <inheritdoc />
public HtmlString ValidationMessage(string expression, string message, object htmlAttributes)
public HtmlString ValidationMessage(string expression, string message, object htmlAttributes, string tag)
{
return GenerateValidationMessage(expression, message, htmlAttributes);
return GenerateValidationMessage(expression, message, htmlAttributes, tag);
}
/// <inheritdoc />
public virtual HtmlString ValidationSummary(bool excludePropertyErrors, string message, IDictionary<string, object> htmlAttributes)
public virtual HtmlString ValidationSummary(bool excludePropertyErrors,
string message,
IDictionary<string, object> htmlAttributes,
string tag)
{
var formContext = ViewContext.ClientValidationEnabled ? ViewContext.FormContext : null;
@ -464,16 +467,20 @@ namespace Microsoft.AspNet.Mvc.Rendering
}
}
string messageSpan;
string wrappedMessage;
if (!string.IsNullOrEmpty(message))
{
var spanTag = new TagBuilder("span");
spanTag.SetInnerText(message);
messageSpan = spanTag.ToString(TagRenderMode.Normal) + Environment.NewLine;
if (string.IsNullOrEmpty(tag))
{
tag = ViewContext.ValidationSummaryMessageElement;
}
var messageTag = new TagBuilder(tag);
messageTag.SetInnerText(message);
wrappedMessage = messageTag.ToString(TagRenderMode.Normal) + Environment.NewLine;
}
else
{
messageSpan = null;
wrappedMessage = null;
}
var htmlSummary = new StringBuilder();
@ -516,7 +523,7 @@ namespace Microsoft.AspNet.Mvc.Rendering
divBuilder.AddCssClass(HtmlHelper.ValidationSummaryCssClassName);
}
divBuilder.InnerHtml = messageSpan + unorderedList.ToString(TagRenderMode.Normal);
divBuilder.InnerHtml = wrappedMessage + unorderedList.ToString(TagRenderMode.Normal);
if (formContext != null)
{
@ -1261,8 +1268,10 @@ namespace Microsoft.AspNet.Mvc.Rendering
return tagBuilder.ToHtmlString(TagRenderMode.SelfClosing);
}
protected virtual HtmlString GenerateValidationMessage(string expression, string message,
object htmlAttributes)
protected virtual HtmlString GenerateValidationMessage(string expression,
string message,
object htmlAttributes,
string tag)
{
var modelName = ViewData.TemplateInfo.GetFullHtmlFieldName(expression);
if (string.IsNullOrEmpty(modelName))
@ -1294,7 +1303,11 @@ namespace Microsoft.AspNet.Mvc.Rendering
// Even if there are no model errors, we generate the span and add the validation message
// if formContext is not null.
var builder = new TagBuilder("span");
if (string.IsNullOrEmpty(tag))
{
tag = ViewContext.ValidationMessageElement;
}
var builder = new TagBuilder(tag);
builder.MergeAttributes(AnonymousObjectToHtmlAttributes(htmlAttributes));
// Only the style of the span is changed according to the errors if message is null or empty.

View File

@ -229,9 +229,14 @@ namespace Microsoft.AspNet.Mvc.Rendering
/// <inheritdoc />
public HtmlString ValidationMessageFor<TProperty>([NotNull] Expression<Func<TModel, TProperty>> expression,
string message, object htmlAttributes)
string message,
object htmlAttributes,
string tag)
{
return GenerateValidationMessage(ExpressionHelper.GetExpressionText(expression), message, htmlAttributes);
return GenerateValidationMessage(ExpressionHelper.GetExpressionText(expression),
message,
htmlAttributes,
tag);
}
/// <inheritdoc />

View File

@ -12,95 +12,202 @@ namespace Microsoft.AspNet.Mvc.Rendering
public static HtmlString ValidationMessage([NotNull] this IHtmlHelper htmlHelper,
string expression)
{
return htmlHelper.ValidationMessage(expression, message: null, htmlAttributes: null);
return htmlHelper.ValidationMessage(expression, message: null, htmlAttributes: null, tag: null);
}
public static HtmlString ValidationMessage([NotNull] this IHtmlHelper htmlHelper,
string expression, string message)
string expression,
string message)
{
return htmlHelper.ValidationMessage(expression, message, htmlAttributes: null);
return htmlHelper.ValidationMessage(expression, message, htmlAttributes: null, tag: null);
}
public static HtmlString ValidationMessage([NotNull] this IHtmlHelper htmlHelper,
string expression, object htmlAttributes)
string expression,
object htmlAttributes)
{
return htmlHelper.ValidationMessage(expression, message: null, htmlAttributes: htmlAttributes);
return htmlHelper.ValidationMessage(expression, message: null, htmlAttributes: htmlAttributes, tag: null);
}
public static HtmlString ValidationMessage([NotNull] this IHtmlHelper htmlHelper,
string expression, string message, object htmlAttributes)
string expression,
string message,
string tag)
{
return htmlHelper.ValidationMessage(expression, message, htmlAttributes);
return htmlHelper.ValidationMessage(expression, message, htmlAttributes: null, tag: tag);
}
public static HtmlString ValidationMessage([NotNull] this IHtmlHelper htmlHelper,
string expression,
string message,
object htmlAttributes)
{
return htmlHelper.ValidationMessage(expression, message, htmlAttributes, tag: null);
}
public static HtmlString ValidationMessage([NotNull] this IHtmlHelper htmlHelper,
string expression,
string message,
object htmlAttributes,
string tag)
{
return htmlHelper.ValidationMessage(expression, message, htmlAttributes, tag);
}
public static HtmlString ValidationMessageFor<TModel, TProperty>([NotNull] this IHtmlHelper<TModel> htmlHelper,
[NotNull] Expression<Func<TModel, TProperty>> expression)
{
return htmlHelper.ValidationMessageFor(expression, message: null, htmlAttributes: null);
return htmlHelper.ValidationMessageFor(expression, message: null, htmlAttributes: null, tag: null);
}
public static HtmlString ValidationMessageFor<TModel, TProperty>([NotNull] this IHtmlHelper<TModel> htmlHelper,
[NotNull] Expression<Func<TModel, TProperty>> expression, string message)
[NotNull] Expression<Func<TModel, TProperty>> expression,
string message)
{
return htmlHelper.ValidationMessageFor(expression, message, htmlAttributes: null);
return htmlHelper.ValidationMessageFor(expression, message, htmlAttributes: null, tag: null);
}
public static HtmlString ValidationMessageFor<TModel, TProperty>([NotNull] this IHtmlHelper<TModel> htmlHelper,
[NotNull] Expression<Func<TModel, TProperty>> expression, string message, object htmlAttributes)
[NotNull] Expression<Func<TModel, TProperty>> expression,
string message,
object htmlAttributes)
{
return htmlHelper.ValidationMessageFor(expression, message, htmlAttributes);
return htmlHelper.ValidationMessageFor(expression, message, htmlAttributes, tag: null);
}
public static HtmlString ValidationMessageFor<TModel, TProperty>([NotNull] this IHtmlHelper<TModel> htmlHelper,
[NotNull] Expression<Func<TModel, TProperty>> expression,
string message,
string tag)
{
return htmlHelper.ValidationMessageFor(expression, message, htmlAttributes: null, tag: tag);
}
public static HtmlString ValidationMessageFor<TModel, TProperty>([NotNull] this IHtmlHelper<TModel> htmlHelper,
[NotNull] Expression<Func<TModel, TProperty>> expression,
string message,
object htmlAttributes,
string tag)
{
return htmlHelper.ValidationMessageFor(expression, message, htmlAttributes, tag);
}
public static HtmlString ValidationSummary([NotNull] this IHtmlHelper htmlHelper)
{
return ValidationSummary(htmlHelper, excludePropertyErrors: false);
return htmlHelper.ValidationSummary(excludePropertyErrors: false,
message: null,
htmlAttributes: null,
tag: null);
}
public static HtmlString ValidationSummary([NotNull] this IHtmlHelper htmlHelper, bool excludePropertyErrors)
{
return ValidationSummary(htmlHelper, excludePropertyErrors, message: null);
return htmlHelper.ValidationSummary(excludePropertyErrors,
message: null,
htmlAttributes: null,
tag: null);
}
public static HtmlString ValidationSummary([NotNull] this IHtmlHelper htmlHelper, string message)
{
return ValidationSummary(htmlHelper, excludePropertyErrors: false, message: message,
htmlAttributes: (object)null);
return htmlHelper.ValidationSummary(excludePropertyErrors: false,
message: message,
htmlAttributes: null,
tag: null);
}
public static HtmlString ValidationSummary(
[NotNull] this IHtmlHelper htmlHelper,
public static HtmlString ValidationSummary([NotNull] this IHtmlHelper htmlHelper, string message, string tag)
{
return htmlHelper.ValidationSummary(excludePropertyErrors: false,
message: message,
htmlAttributes: null,
tag: tag);
}
public static HtmlString ValidationSummary([NotNull] this IHtmlHelper htmlHelper,
bool excludePropertyErrors,
string message)
{
return ValidationSummary(htmlHelper, excludePropertyErrors, message, htmlAttributes: (object)null);
return htmlHelper.ValidationSummary(excludePropertyErrors,
message,
htmlAttributes: null,
tag: null);
}
public static HtmlString ValidationSummary(
[NotNull] this IHtmlHelper htmlHelper,
public static HtmlString ValidationSummary([NotNull] this IHtmlHelper htmlHelper,
string message,
object htmlAttributes)
{
return ValidationSummary(htmlHelper, excludePropertyErrors: false, message: message,
htmlAttributes: HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes));
return htmlHelper.ValidationSummary(excludePropertyErrors: false,
message: message,
htmlAttributes: HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes),
tag: null);
}
public static HtmlString ValidationSummary(
[NotNull] this IHtmlHelper htmlHelper,
public static HtmlString ValidationSummary([NotNull] this IHtmlHelper htmlHelper,
string message,
object htmlAttributes,
string tag)
{
return htmlHelper.ValidationSummary(excludePropertyErrors: false,
message: message,
htmlAttributes: HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes),
tag: tag);
}
public static HtmlString ValidationSummary([NotNull] this IHtmlHelper htmlHelper,
bool excludePropertyErrors,
string message,
string tag)
{
return htmlHelper.ValidationSummary(excludePropertyErrors,
message,
htmlAttributes: null,
tag: tag);
}
public static HtmlString ValidationSummary([NotNull] this IHtmlHelper htmlHelper,
bool excludePropertyErrors,
string message,
object htmlAttributes)
{
return htmlHelper.ValidationSummary(excludePropertyErrors, message,
HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes));
return htmlHelper.ValidationSummary(excludePropertyErrors,
message,
HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes),
tag: null);
}
public static HtmlString ValidationSummary(
[NotNull] this IHtmlHelper htmlHelper,
public static HtmlString ValidationSummary([NotNull] this IHtmlHelper htmlHelper,
bool excludePropertyErrors,
string message,
object htmlAttributes,
string tag)
{
return htmlHelper.ValidationSummary(excludePropertyErrors,
message,
HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes),
tag);
}
public static HtmlString ValidationSummary([NotNull] this IHtmlHelper htmlHelper,
string message,
IDictionary<string, object> htmlAttributes)
{
return htmlHelper.ValidationSummary(excludePropertyErrors: false, message: message,
htmlAttributes: htmlAttributes);
return htmlHelper.ValidationSummary(excludePropertyErrors: false,
message: message,
htmlAttributes: htmlAttributes,
tag: null);
}
public static HtmlString ValidationSummary([NotNull] this IHtmlHelper htmlHelper,
string message,
IDictionary<string, object> htmlAttributes,
string tag)
{
return htmlHelper.ValidationSummary(excludePropertyErrors: false,
message: message,
htmlAttributes: htmlAttributes,
tag: tag);
}
}
}

View File

@ -447,8 +447,10 @@ namespace Microsoft.AspNet.Mvc.Rendering
/// <param name="htmlAttributes"> An object that contains the HTML attributes to set for the element.
/// Alternatively, an <see cref="IDictionary{string, object}"/> instance containing the HTML attributes.
/// </param>
/// <param name="tag">The tag to wrap the <paramref name="message"/> in the generated HTML.
/// Its default value is <see cref="ViewContext.ValidationMessageElement" />.</param>
/// <returns>An <see cref="HtmlString"/> that contains the validation message</returns>
HtmlString ValidationMessage(string modelName, string message, object htmlAttributes);
HtmlString ValidationMessage(string modelName, string message, object htmlAttributes, string tag);
/// <summary>
/// Returns an unordered list (ul element) of validation messages that are in the
@ -458,12 +460,15 @@ namespace Microsoft.AspNet.Mvc.Rendering
/// have the summary display all errors.</param>
/// <param name="message">The message to display with the validation summary.</param>
/// <param name="htmlAttributes">A dictionary that contains the HTML attributes for the element.</param>
/// <param name="tag">The tag to wrap the <paramref name="message"/> in the generated HTML.
/// Its default value is <see cref="ViewContext.ValidationMessageElement" />.</param>
/// <returns>An <see cref="HtmlString"/> that contains an unordered list (ul element) of validation messages.
/// </returns>
HtmlString ValidationSummary(
bool excludePropertyErrors,
string message,
IDictionary<string, object> htmlAttributes);
IDictionary<string, object> htmlAttributes,
string tag);
/// <summary>
/// Returns the model value for the given expression <paramref name="name"/>.

View File

@ -253,9 +253,13 @@ namespace Microsoft.AspNet.Mvc.Rendering
/// <param name="htmlAttributes"> An object that contains the HTML attributes to set for the element.
/// Alternatively, an /// <see cref="IDictionary{string, object}"/> instance containing the HTML attributes.
/// </param>
/// <param name="tag">The tag to wrap the <paramref name="message"/> in the generated HTML.
/// Its default value is <see cref="ViewContext.ValidationMessageElement" />.</param>
/// <returns>An <see cref="HtmlString"/> that contains the validation message</returns>
HtmlString ValidationMessageFor<TProperty>([NotNull] Expression<Func<TModel, TProperty>> expression,
string message, object htmlAttributes);
string message,
object htmlAttributes,
string tag);
/// <summary>
/// Returns the model value for the given expression <paramref name="expression"/>.

View File

@ -29,6 +29,8 @@ namespace Microsoft.AspNet.Mvc
_formContext = _defaultFormContext;
UnobtrusiveJavaScriptEnabled = true;
ClientValidationEnabled = true;
ValidationSummaryMessageElement = "span";
ValidationMessageElement = "span";
}
public ViewContext(
@ -41,6 +43,8 @@ namespace Microsoft.AspNet.Mvc
_formContext = viewContext.FormContext;
UnobtrusiveJavaScriptEnabled = viewContext.UnobtrusiveJavaScriptEnabled;
ClientValidationEnabled = viewContext.ClientValidationEnabled;
ValidationSummaryMessageElement = viewContext.ValidationSummaryMessageElement;
ValidationMessageElement = viewContext.ValidationMessageElement;
View = view;
ViewData = viewData;
@ -64,6 +68,18 @@ namespace Microsoft.AspNet.Mvc
public bool ClientValidationEnabled { get; set; }
/// <summary>
/// Element name used to wrap a top-level message generated by
/// <see cref="HtmlHelperValidationExtensions.ValidationSummary(IHtmlHelper)"/> and other overloads.
/// </summary>
public string ValidationSummaryMessageElement { get; set; }
/// <summary>
/// Element name used to wrap a top-level message generated by
/// <see cref="HtmlHelperValidationExtensions.ValidationMessage(IHtmlHelper, string)"/> and other overloads.
/// </summary>
public string ValidationMessageElement { get; set; }
public dynamic ViewBag
{
get