Расширение на Ответ Джейсона Мора , вот один с перегрузками для атрибутов HTML.
Требуется пакет NuGet с лицензией MIT Inflector
: Install-Package Inflector
.
Пример использования:
Html.LabelTitleizeFor(model => model.FirstName)
Html.LabelTitleizeFor(model => model.FirstName, htmlAttributes: new { @class="control-label col-md-2" })
public static class HtmlHelperExtensions
{
public static MvcHtmlString LabelTitleizeFor<T, TResult>(this HtmlHelper<T> helper, Expression<Func<T, TResult>> expression)
{
return LabelTitleizeHelper(helper, expression, null);
}
public static MvcHtmlString LabelTitleizeFor<T, TResult>(this HtmlHelper<T> helper, Expression<Func<T, TResult>> expression, IDictionary<string, object> htmlAttributes)
{
return LabelTitleizeHelper(helper, expression, htmlAttributes);
}
public static MvcHtmlString LabelTitleizeFor<T, TResult>(this HtmlHelper<T> helper, Expression<Func<T, TResult>> expression, object htmlAttributes)
{
return LabelTitleizeHelper(helper, expression, HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes));
}
private static MvcHtmlString LabelTitleizeHelper<T, TResult>(HtmlHelper<T> html, Expression<Func<T, TResult>> expression, IDictionary<string, object> htmlAttributes = null)
{
string propertyName = ExpressionHelper
.GetExpressionText(expression)
.Split('.')
.Last();
if (string.IsNullOrEmpty(propertyName))
return MvcHtmlString.Empty;
ModelMetadata metadata = ModelMetadata.FromLambdaExpression(expression, html.ViewData);
string labelValue = metadata.DisplayName ?? Inflector.Inflector.Titleize(propertyName);
TagBuilder tagBuilder = new TagBuilder("label");
tagBuilder.Attributes.Add("for", TagBuilder.CreateSanitizedId(html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(propertyName)));
tagBuilder.SetInnerText(labelValue);
tagBuilder.MergeAttributes(htmlAttributes, true);
return new MvcHtmlString(tagBuilder.ToString(TagRenderMode.Normal));
}
}
Этот код лицензирован Unlicense (свободно использовать и изменять в любом контексте без указания авторства).