HtmlHelper custom Control

HtmlHelper custom Control

Das folgende Code-Beispiel enthält eine einfache Erweiterung um eine Benutzerdefinierte textarea zu rendern.
Dabei wird Model-Binding verwendet und die grundliegende MVC Struktur berücksichtigt.

public static MvcHtmlString CustomTextArea<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression)
{
    return CustomTextArea<TModel, TValue>(html, expression, null);
}

public static MvcHtmlString CustomTextArea<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression, object htmlAttributes)
{
    // Liefert den Name der Eigenschaft im Model
    string controlName = ExpressionHelper.GetExpressionText(expression);

    TagBuilder textarea = new TagBuilder("textarea");

    // Benutzerdefinierte Attribute holen und der textarea hinzufügen
    RouteValueDictionary attributes = HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes);
    textarea.MergeAttributes(attributes, false);

    // Attribute name und id setzen. Dies sollte immer geschehen!
    textarea.Attributes["name"] = controlName;
    textarea.Attributes["id"] = HtmlHelper.GenerateIdFromName(controlName);

    // Falls das Formular bereits abgesendet wurde, so sollte der eingegebene Wert erhalten bleiben.
    ModelMetadata md = ModelMetadata.FromLambdaExpression(expression, html.ViewData);
    if (md != null && md.Model != null)
    {
        textarea.SetInnerText(md.Model.ToString());
    }

    // Bei Validierungs-Fehler sollte zusätzlich eine Klasse hinzugefügt werden.
    // Diese wird z.B. standardmäßig von jQuery Unobtrusive Validation verwendet.
    ModelState state = html.ViewData.ModelState[controlName];
    if (state != null && state.Errors.Count > 0)
    {
        textarea.AddCssClass(HtmlHelper.ValidationInputCssClassName);
    }

    return MvcHtmlString.Create(textarea.ToString(TagRenderMode.Normal));
}
Um einen Kommentar zu hinterlassen, ist eine Anmeldung erforderlich.