Changes enabling TextArea, TextAreaFor.

Changing the interface to directly include Rows and Columns.
This commit is contained in:
sornaks 2014-04-22 14:18:59 -07:00
parent b899cac4c8
commit 112a5ddc50
10 changed files with 169 additions and 25 deletions

View File

@ -96,6 +96,7 @@ namespace MvcSample.Web
Address = "Dependents address", Address = "Dependents address",
Alive = false, Alive = false,
}, },
About = "I am a Software Engineer"
}; };
return user; return user;

View File

@ -13,7 +13,7 @@ namespace MvcSample.Web.Models
public User Dependent { get; set; } public User Dependent { get; set; }
public bool Alive { get; set; } public bool Alive { get; set; }
public string Password { get; set; } public string Password { get; set; }
public string About { get; set; }
public string Log { get; set; } public string Log { get; set; }
} }
} }

View File

@ -67,6 +67,14 @@
@Html.DropDownListFor(model => model.Age, (IEnumerable<SelectListItem>)ViewBag.Ages, htmlAttributes: new { @class = "form-control" }) @Html.DropDownListFor(model => model.Age, (IEnumerable<SelectListItem>)ViewBag.Ages, htmlAttributes: new { @class = "form-control" })
</td> </td>
</tr> </tr>
<tr>
<td>
<label class="control-label col-md-2">Model.Name</label>
</td>
<td>
@Html.TextArea("About", "You can explain about your profession, hobbies etc.", 5, 40, htmlAttributes: new { style = "font-weight:bold" })
</td>
</tr>
<tr> <tr>
<td> <td>
<input type="submit" value="Save" class="btn btn-default" style="margin-left: 10px" /> <input type="submit" value="Save" class="btn btn-default" style="margin-left: 10px" />

View File

@ -906,6 +906,22 @@ namespace Microsoft.AspNet.Mvc.Core
return GetString("AuthorizeAttribute_OnAuthorizationNotImplemented"); return GetString("AuthorizeAttribute_OnAuthorizationNotImplemented");
} }
/// <summary>
/// The value must be greater than or equal to zero..
/// </summary>
internal static string HtmlHelper_TextAreaParameterOutOfRange
{
get { return GetString("HtmlHelper_TextAreaParameterOutOfRange"); }
}
/// <summary>
/// The value must be greater than or equal to zero..
/// </summary>
internal static string FormatHtmlHelper_TextAreaParameterOutOfRange()
{
return GetString("HtmlHelper_TextAreaParameterOutOfRange");
}
private static string GetString(string name, params string[] formatterNames) private static string GetString(string name, params string[] formatterNames)
{ {
var value = _resourceManager.GetString(name); var value = _resourceManager.GetString(name);

View File

@ -513,6 +513,18 @@ namespace Microsoft.AspNet.Mvc.Rendering
} }
} }
/// <inheritdoc />
public virtual HtmlString TextArea(string name, string value, int rows, int columns, object htmlAttributes)
{
var metadata = ExpressionMetadataProvider.FromStringExpression(name, ViewData, MetadataProvider);
if (value != null)
{
metadata.Model = value;
}
return GenerateTextArea(metadata, name, rows, columns, htmlAttributes);
}
/// <inheritdoc /> /// <inheritdoc />
public HtmlString TextBox(string name, object value, string format, IDictionary<string, object> htmlAttributes) public HtmlString TextBox(string name, object value, string format, IDictionary<string, object> htmlAttributes)
{ {
@ -959,48 +971,65 @@ namespace Microsoft.AspNet.Mvc.Rendering
return tagBuilder.ToHtmlString(TagRenderMode.Normal); return tagBuilder.ToHtmlString(TagRenderMode.Normal);
} }
internal static MvcHtmlString TextAreaHelper(HtmlHelper htmlHelper, ModelMetadata modelMetadata, string name, IDictionary<string, object> rowsAndColumns, IDictionary<string, object> htmlAttributes, string innerHtmlPrefix = null) protected virtual HtmlString GenerateTextArea(ModelMetadata metadata, string name,
int rows, int columns, object htmlAttributes)
{ {
string fullName = htmlHelper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(name); if (rows < 0)
if (String.IsNullOrEmpty(fullName))
{ {
throw new ArgumentException(MvcResources.Common_NullOrEmpty, "name"); throw new ArgumentOutOfRangeException("rows", Resources.HtmlHelper_TextAreaParameterOutOfRange);
} }
TagBuilder tagBuilder = new TagBuilder("textarea"); if (columns < 0)
tagBuilder.GenerateId(fullName); {
tagBuilder.MergeAttributes(htmlAttributes, true); throw new ArgumentOutOfRangeException("columns", Resources.HtmlHelper_TextAreaParameterOutOfRange);
tagBuilder.MergeAttributes(rowsAndColumns, rowsAndColumns != implicitRowsAndColumns); // Only force explicit rows/cols }
tagBuilder.MergeAttribute("name", fullName, true);
var fullName = ViewData.TemplateInfo.GetFullHtmlFieldName(name);
if (string.IsNullOrEmpty(fullName))
{
throw new ArgumentException(Resources.ArgumentCannotBeNullOrEmpty, "name");
}
// If there are any errors for a named field, we add the CSS attribute.
ModelState modelState; ModelState modelState;
if (htmlHelper.ViewData.ModelState.TryGetValue(fullName, out modelState) && modelState.Errors.Count > 0) ViewData.ModelState.TryGetValue(fullName, out modelState);
{
tagBuilder.AddCssClass(HtmlHelper.ValidationInputCssClassName);
}
tagBuilder.MergeAttributes(htmlHelper.GetUnobtrusiveValidationAttributes(name, modelMetadata)); string value = string.Empty;
string value;
if (modelState != null && modelState.Value != null) if (modelState != null && modelState.Value != null)
{ {
value = modelState.Value.AttemptedValue; value = modelState.Value.AttemptedValue;
} }
else if (modelMetadata.Model != null) else if (metadata.Model != null)
{ {
value = modelMetadata.Model.ToString(); value = metadata.Model.ToString();
} }
else
var tagBuilder = new TagBuilder("textarea");
tagBuilder.GenerateId(fullName, IdAttributeDotReplacement);
tagBuilder.MergeAttributes(AnonymousObjectToHtmlAttributes(htmlAttributes), true);
if (rows > 0)
{ {
value = String.Empty; tagBuilder.MergeAttribute("rows", rows.ToString(CultureInfo.InvariantCulture), true);
}
if (columns > 0)
{
tagBuilder.MergeAttribute("columns", columns.ToString(CultureInfo.InvariantCulture), true);
}
tagBuilder.MergeAttribute("name", fullName, true);
tagBuilder.MergeAttributes(GetValidationAttributes(name, metadata));
// If there are any errors for a named field, we add this CSS attribute.
if (modelState != null && modelState.Errors.Count > 0)
{
tagBuilder.AddCssClass(HtmlHelper.ValidationInputCssClassName);
} }
// The first newline is always trimmed when a TextArea is rendered, so we add an extra one // 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". // in case the value being rendered is something like "\r\nHello".
tagBuilder.InnerHtml = (innerHtmlPrefix ?? Environment.NewLine) + HttpUtility.HtmlEncode(value); tagBuilder.InnerHtml = WebUtility.HtmlEncode(value);
return tagBuilder.ToMvcHtmlString(TagRenderMode.Normal); return tagBuilder.ToHtmlString(TagRenderMode.Normal);
} }
protected virtual HtmlString GenerateTextBox(ModelMetadata metadata, string name, object value, string format, protected virtual HtmlString GenerateTextBox(ModelMetadata metadata, string name, object value, string format,

View File

@ -166,6 +166,14 @@ namespace Microsoft.AspNet.Mvc.Rendering
htmlAttributes: htmlAttributes); htmlAttributes: htmlAttributes);
} }
/// <inheritdoc />
public HtmlString TextAreaFor<TProperty>([NotNull] Expression<Func<TModel, TProperty>> expression, int rows,
int columns, object htmlAttributes)
{
var metadata = GetModelMetadata(expression);
return GenerateTextArea(metadata, GetExpressionName(expression), rows, columns, htmlAttributes);
}
/// <inheritdoc /> /// <inheritdoc />
public HtmlString TextBoxFor<TProperty>([NotNull] Expression<Func<TModel, TProperty>> expression, public HtmlString TextBoxFor<TProperty>([NotNull] Expression<Func<TModel, TProperty>> expression,
string format, IDictionary<string, object> htmlAttributes) string format, IDictionary<string, object> htmlAttributes)

View File

@ -184,5 +184,53 @@ namespace Microsoft.AspNet.Mvc.Rendering
{ {
return htmlHelper.TextBoxFor(expression, format: null, htmlAttributes: htmlAttributes); return htmlHelper.TextBoxFor(expression, format: null, htmlAttributes: htmlAttributes);
} }
public static HtmlString TextArea([NotNull] this IHtmlHelper htmlHelper,
string name)
{
return htmlHelper.TextArea(name, value: null, rows: 0, columns: 0, htmlAttributes: null);
}
public static HtmlString TextArea([NotNull] this IHtmlHelper htmlHelper,
string name, object htmlAttributes)
{
return htmlHelper.TextArea(name, value: null, rows: 0, columns:0, htmlAttributes: htmlAttributes);
}
public static HtmlString TextArea([NotNull] this IHtmlHelper htmlHelper,
string name, string value)
{
return htmlHelper.TextArea(name, value, rows: 0, columns: 0, htmlAttributes: null);
}
public static HtmlString TextArea([NotNull] this IHtmlHelper htmlHelper,
string name, string value, object htmlAttributes)
{
return htmlHelper.TextArea(name, value, rows: 0, columns: 0, htmlAttributes: htmlAttributes);
}
public static HtmlString TextArea([NotNull] this IHtmlHelper htmlHelper,
string name, string value, int rows, int columns, object htmlAttributes)
{
return htmlHelper.TextArea(name, value, rows, columns, htmlAttributes);
}
public static HtmlString TextAreaFor<TModel, TProperty>([NotNull] this IHtmlHelper<TModel> htmlHelper,
[NotNull] Expression<Func<TModel, TProperty>> expression)
{
return htmlHelper.TextAreaFor(expression, rows: 0, columns: 0, htmlAttributes: null);
}
public static HtmlString TextAreaFor<TModel, TProperty>([NotNull] this IHtmlHelper<TModel> htmlHelper,
[NotNull] Expression<Func<TModel, TProperty>> expression, object htmlAttributes)
{
return htmlHelper.TextAreaFor(expression, rows: 0, columns: 0, htmlAttributes: htmlAttributes);
}
public static HtmlString TextAreaFor<TModel, TProperty>([NotNull] this IHtmlHelper<TModel> htmlHelper,
[NotNull] Expression<Func<TModel, TProperty>> expression, int rows, int columns, object htmlAttributes)
{
return htmlHelper.TextAreaFor(expression, rows, columns, htmlAttributes);
}
} }
} }

View File

@ -341,6 +341,24 @@ namespace Microsoft.AspNet.Mvc.Rendering
/// <returns>A task that represents when rendering has completed.</returns> /// <returns>A task that represents when rendering has completed.</returns>
Task RenderPartialAsync([NotNull] string partialViewName, object model, ViewDataDictionary viewData); Task RenderPartialAsync([NotNull] string partialViewName, object model, ViewDataDictionary viewData);
/// <summary>
/// Render a textarea.
/// </summary>
/// <param name="name">
/// Rendered element's name. Also use this name to find value in submitted data or view data. Use view data
/// only if value is not in submitted data and <paramref name="value"/> is <c>null</c>.
/// </param>
/// <param name="value">
/// If non-<c>null</c>, value to include in the element. Ignore if named value is found in submitted data.
/// </param>
/// <param name="rows">Number of rows in the textarea.</param>
/// <param name="columns">Number of columns in the textarea.</param>
/// <param name="htmlAttributes">
/// <see cref="IDictionary{string, object}"/> containing additional HTML attributes.
/// </param>
/// <returns>New <see cref="HtmlString"/> containing the rendered HTML.</returns>
HtmlString TextArea(string name, string value, int rows, int columns, object htmlAttributes);
/// <summary> /// <summary>
/// Render an input element of type "text". /// Render an input element of type "text".
/// </summary> /// </summary>

View File

@ -177,6 +177,19 @@ namespace Microsoft.AspNet.Mvc.Rendering
HtmlString RadioButtonFor<TProperty>([NotNull] Expression<Func<TModel, TProperty>> expression, object value, HtmlString RadioButtonFor<TProperty>([NotNull] Expression<Func<TModel, TProperty>> expression, object value,
object htmlAttributes); object htmlAttributes);
/// <summary>
/// Render a textarea.
/// </summary>
/// <param name="expression">An expression, relative to the current model.</param>
/// <param name="rows">Number of rows in the textarea.</param>
/// <param name="columns">Number of columns in the textarea.</param>
/// <param name="htmlAttributes">
/// <see cref="IDictionary{string, object}"/> containing additional HTML attributes.
/// </param>
/// <returns>New <see cref="HtmlString"/> containing the rendered HTML.</returns>
HtmlString TextAreaFor<TProperty>([NotNull] Expression<Func<TModel, TProperty>> expression,
int rows, int columns, object htmlAttributes);
/// <summary> /// <summary>
/// Render an input element of type "text". /// Render an input element of type "text".
/// </summary> /// </summary>

View File

@ -285,4 +285,7 @@
<data name="AuthorizeAttribute_OnAuthorizationNotImplemented" xml:space="preserve"> <data name="AuthorizeAttribute_OnAuthorizationNotImplemented" xml:space="preserve">
<value>OnAuthorization is not implemented by this filter, use OnAuthorizationAsync instead.</value> <value>OnAuthorization is not implemented by this filter, use OnAuthorizationAsync instead.</value>
</data> </data>
</root> <data name="HtmlHelper_TextAreaParameterOutOfRange" xml:space="preserve">
<value>The value must be greater than or equal to zero.</value>
</data>
</root>