Я знаю, что видел это раньше. Я не помню, было ли это демонстрацией шаблона C4MVC или конструктором ввода! Мне нужно знать, как я могу использовать соглашение CamelCasing о моих свойствах модели просмотра и иметь "CamelCasedProperty", представленный на этикетке как "Свойство с верблюжьей оболочкой". Это должно обрабатываться мастером создания новых представлений, а не программным образом обрабатывать это.
В ASP.NET MVC, как мне отобразить имя свойства как разделение ярлыков на CamelCase
Ответ 1
После того, как кто-то соскучился, я вроде как нашел, что меня заинтересовал. Наблюдение этого видео C4MVC. Я уверен, что это может быть уже выполнено в MVC Contrib в качестве входного конструктора. Тем не менее, я очень заинтересован в понимании всех подкреплений, так сказать, чтобы узнать все, что могу, для моей будущей книги "ASP.NET MVC Cookbook" (бесстыдный плагин для общественного обзора). Вот решение, которое я придумал, только требует от меня переименовать Html.LabelFor в Html.LabelFor2 в сгенерированной форме кода "Создать новый вид":
Я создал метод, чтобы получить имя свойства из переданного в lambda. Затем я создал другой метод для синтаксического анализа имени свойства в строчных буквах, содержащихся в имени.
using System;
using System.Linq.Expressions;
using System.Text.RegularExpressions;
namespace FuryPartners.WebClient.Helpers
{
public class HelperUtilities
{
internal static string PropertyName<T, TResult>(Expression<Func<T, TResult>> expression)
{
switch (expression.Body.NodeType)
{
case ExpressionType.MemberAccess:
var memberExpression = expression.Body as MemberExpression;
return memberExpression.Member.Name;
default:
return "oops";
}
}
internal static string SplitCamelCase(string camelCaseString)
{
string output = System.Text.RegularExpressions.Regex.Replace(
camelCaseString,
"([A-Z])",
" $1",
RegexOptions.Compiled).Trim();
return output;
}
}
}
Затем я расширил HtmlHelper, чтобы иметь метод LabelFor2, который строит и передает соответствующий формат отображения имени свойства.
using System;
using System.Linq.Expressions;
using System.Web.Mvc;
namespace FuryPartners.WebClient.Helpers
{
public static class LabelHelpers
{
public static MvcHtmlString LabelFor2<T, TResult>(this HtmlHelper<T> helper, Expression<Func<T, TResult>> expression)
{
string propertyName = HelperUtilities.PropertyName(expression);
string labelValue = HelperUtilities.SplitCamelCase(propertyName);
string label = String.Format("<label for=\"{0}\">{1}</label>", propertyName, labelValue);
return MvcHtmlString.Create(label);
}
}
}
Ответ 2
Я не думаю, что вы хотите в ванильном ASP.NET MVC 2.
В ASP.NET MVC 2 вам необходимо украсить вашу модель атрибутом DisplayName с нужным текстом, а затем автоматически созданный мастер будет использовать LabelFor
для вывода метки для свойства. Например:
class MyModel()
{
[DisplayName("Your Property Name")]
public string YourPropertyName { get; set; }
}
Тогда в представлении:
<%= Html.LabelFor(m => m.YourPropertyName) %>
Если вы видели демонстрацию того, как это было сделано другим способом, это могло быть из проекта MvcContrib для InputBuilders.
Вот прямая ссылка на часть проекта, я думаю, что вы ссылаетесь на:
Текст, выделенный красным цветом, это метки, которые относятся к типу модели. Метка создается из объекта PropertyInfo, который представляет соответствующие свойства режима.
Метка - это Имя свойства.
Метка - это Имя свойства, которое разбивается на имя свойства паскаля.
Метка указывается с использованием атрибута метки, применяемого к свойству.
Ответ 3
У меня есть более простая новая версия, чтобы создать ярлык Title-ized из ответа Andrews, используя код MVC2 для оценки любых атрибутов [DisplayName (...)]
public static class LabelHelpers
{
public static MvcHtmlString LabelTitleizeFor<T, TResult>(this HtmlHelper<T> helper, Expression<Func<T, TResult>> expression)
{
string propertyName = ExpressionHelper.GetExpressionText(expression);
if (propertyName.IndexOf(".") > 0)
{
propertyName = propertyName.Substring(propertyName.LastIndexOf(".") + 1);
}
string labelValue = ModelMetadata.FromLambdaExpression(expression, helper.ViewData).DisplayName;
if (string.IsNullOrEmpty(labelValue))
{
labelValue = Inflector.Net.Inflector.Titleize(propertyName);
}
string label = String.Format("<label for=\"{0}\">{1}</label>", propertyName, labelValue);
return MvcHtmlString.Create(label);
}
}
используя https://github.com/srkirkland/Inflector/blob/master/Inflector/Inflector.cs
Ответ 4
Расширение на Jason More answer, здесь с перегрузками для атрибутов HTML.
Требуется MIT-лицензированный пакет Inflector
NuGet: 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 лицензирован (можно использовать и изменять в любом контексте без атрибуции).