From b899cac4c81a7c1e1f6b3bc76897494d37ec7ad6 Mon Sep 17 00:00:00 2001 From: sornaks Date: Tue, 22 Apr 2014 14:03:04 -0700 Subject: [PATCH] Porting TextAreaHelper from existing MVC code. --- .../Rendering/Html/HtmlHelper.cs | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/src/Microsoft.AspNet.Mvc.Core/Rendering/Html/HtmlHelper.cs b/src/Microsoft.AspNet.Mvc.Core/Rendering/Html/HtmlHelper.cs index 544b3f8a22..ab29ffffbf 100644 --- a/src/Microsoft.AspNet.Mvc.Core/Rendering/Html/HtmlHelper.cs +++ b/src/Microsoft.AspNet.Mvc.Core/Rendering/Html/HtmlHelper.cs @@ -959,6 +959,50 @@ namespace Microsoft.AspNet.Mvc.Rendering return tagBuilder.ToHtmlString(TagRenderMode.Normal); } + internal static MvcHtmlString TextAreaHelper(HtmlHelper htmlHelper, ModelMetadata modelMetadata, string name, IDictionary rowsAndColumns, IDictionary htmlAttributes, string innerHtmlPrefix = null) + { + string fullName = htmlHelper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(name); + if (String.IsNullOrEmpty(fullName)) + { + throw new ArgumentException(MvcResources.Common_NullOrEmpty, "name"); + } + + TagBuilder tagBuilder = new TagBuilder("textarea"); + tagBuilder.GenerateId(fullName); + tagBuilder.MergeAttributes(htmlAttributes, true); + tagBuilder.MergeAttributes(rowsAndColumns, rowsAndColumns != implicitRowsAndColumns); // Only force explicit rows/cols + tagBuilder.MergeAttribute("name", fullName, true); + + // If there are any errors for a named field, we add the CSS attribute. + ModelState modelState; + if (htmlHelper.ViewData.ModelState.TryGetValue(fullName, out modelState) && modelState.Errors.Count > 0) + { + tagBuilder.AddCssClass(HtmlHelper.ValidationInputCssClassName); + } + + tagBuilder.MergeAttributes(htmlHelper.GetUnobtrusiveValidationAttributes(name, modelMetadata)); + + string value; + if (modelState != null && modelState.Value != null) + { + value = modelState.Value.AttemptedValue; + } + else if (modelMetadata.Model != null) + { + value = modelMetadata.Model.ToString(); + } + else + { + value = String.Empty; + } + + // The first newline is always trimmed when a TextArea is rendered, so we add an extra one + // in case the value being rendered is something like "\r\nHello". + tagBuilder.InnerHtml = (innerHtmlPrefix ?? Environment.NewLine) + HttpUtility.HtmlEncode(value); + + return tagBuilder.ToMvcHtmlString(TagRenderMode.Normal); + } + protected virtual HtmlString GenerateTextBox(ModelMetadata metadata, string name, object value, string format, IDictionary htmlAttributes) {