В ASP.NET MVC как отобразить имя свойства в виде разделения метки на CamelCase - PullRequest
11 голосов
/ 27 апреля 2010

Я знаю, что видел это раньше. Я не могу вспомнить, была ли это демонстрационная версия шаблона C4MVC или конструктор ввода! Мне нужно знать, как я могу использовать соглашение CamelCasing о свойствах моей модели представления и о том, чтобы «CamelCasedProperty» отображался в метке как «Camel Cased Property». Это должно быть обработано мастером создания нового представления, а не программной обработкой этого.

Ответы [ 4 ]

20 голосов
/ 27 апреля 2010

Я не думаю, что то, что вы хотите, возможно в vanilla 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 .

Вот прямая ссылка на часть проекта, на которую, я думаю, вы ссылаетесь:

http://www.lostechies.com/blogs/hex/archive/2009/06/09/opinionated-input-builders-for-asp-net-mvc-part-2-html-layout-for-the-label.aspx

Текст, выделенный красным цветом, представляет собой метки, которые относятся к типу модели. Метка создается из объекта PropertyInfo, который представляет соответствующие свойства режима.

Ярлык - Имя свойства.

Метка - это имя свойства, которое разделено на имя свойства паскаля.

Метка указывается с помощью атрибута метки, примененного к свойству.

7 голосов
/ 27 апреля 2010

После того, как я немного покопался, я нашел способ найти то, что мне было интересно. Смотреть это C4MVC видео . Я уверен, что это может быть уже выполнено в MVC Contrib как конструктор ввода. Тем не менее, я очень заинтересован в том, чтобы разобраться во всех подкреплениях, так сказать, чтобы узнать все, что я могу, за мою будущую книгу «ASP.NET MVC Cookbook» (бессовестный плагин для публичного просмотра) . Вот решение, которое я придумала, которое требует от меня только переименования Html.LabelFor в Html.LabelFor2 в сгенерированном виде кода «создать новое представление»:

Я создал метод для получения имени свойства из переданного в лямбду. Затем я создал другой метод для анализа имени свойства в верхнем регистре букв, содержащихся в имени.

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 голосов
/ 02 сентября 2010

У меня есть более простая новая версия для создания надписей с заголовком из ответа Эндрюса, использующего код 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

0 голосов
/ 21 июля 2017

Расширение на Ответ Джейсона Мора , вот один с перегрузками для атрибутов 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 (свободно использовать и изменять в любом контексте без указания авторства).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...