Могу ли я изменить способ визуализации LabelFor в MVC? - PullRequest
4 голосов
/ 30 июня 2010

Я хотел бы изменить способ визуализации LabelFor.Могу ли я сделать это с помощью DisplayTemplate?

LabelFor сгенерировать тег метки, и я хотел бы добавить «:» в конце метки.

спасибо!

Alex

Ответы [ 5 ]

7 голосов
/ 01 июля 2010

Вот HTML-помощник, который сделает это:

public static class LabelExtensions {
    [SuppressMessage("Microsoft.Design", "CA1006:DoNotNestGenericTypesInMemberSignatures", Justification = "This is an appropriate nesting of generic types")]
    public static MvcHtmlString SmartLabelFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression) {
        return LabelHelper(html,
                           ModelMetadata.FromLambdaExpression(expression, html.ViewData),
                           ExpressionHelper.GetExpressionText(expression));
    }

    internal static MvcHtmlString LabelHelper(HtmlHelper html, ModelMetadata metadata, string htmlFieldName) {
        string labelText = metadata.DisplayName ?? metadata.PropertyName ?? htmlFieldName.Split('.').Last();
        if (String.IsNullOrEmpty(labelText)) {
            return MvcHtmlString.Empty;
        }

        // uncomment if want * for required field
        //if (metadata.IsRequired) labelText = labelText + " *";
        labelText = labelText + ":";

        TagBuilder tag = new TagBuilder("label");
        tag.Attributes.Add("for", html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldId(htmlFieldName));
        tag.SetInnerText(labelText);
        return MvcHtmlString.Create(tag.ToString(TagRenderMode.Normal));
    }
}

Чтобы использовать это:

<%:Html.SmartLabelFor(m => m.FirstName)%>

Будет отображаться:

<label for="FirstName">First Name:</label>

Или, если вы раскомментируете обязательное поле, связанное *

<label for="FirstName">First Name *:</label>
2 голосов
/ 30 июня 2010

Просто напишите обычный элемент <label> в простом HTML:

<label>My Label:</label>

Если вы хотите вывести атрибут for="" и точно отобразить имя элемента управления, используйте этот метод расширения:

using System; 
using System.Linq.Expressions; 
using System.Web.Mvc; 

namespace MvcLibrary.Extensions 
{ 
    public static class HtmlExtensions 
    { 
        public static MvcHtmlString FieldIdFor<TModel, TValue>(
            this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression) 
        { 
            string htmlFieldName = ExpressionHelper.GetExpressionText(expression); 
            string inputFieldId = html.ViewContext.ViewData.
                                      TemplateInfo.GetFullHtmlFieldId(htmlFieldName); 
            return MvcHtmlString.Create(inputFieldId); 
        } 
    } 
}

Тогда вы можете использовать, по вашему мнению, так:

<label for="<%= Html.FieldIdFor(m => m.EmailAddress) %>">E-mail address:</label> 
<%= Html.TextBoxFor(m => m.EmailAddress) %>

Другие посты охватывают разные подходы, все они одинаково действительны, и то, к чему вы обращаетесь, является вопросом личных предпочтений.Лично я предпочитаю писать <label> в виде простого HTML, так как это дает дизайнерам больше гибкости при изменении разметки, добавлении дополнительных атрибутов, таких как классы CSS и т. Д. Также я считаю, что текст метки является проблемой представления и не должен быть оформлен в классе ViewModel, но это только мое личное мнение / предпочтение, я знаю, что некоторые люди здесь не согласятся со мной, и это нормально: -)

1 голос
/ 30 июня 2010

Вы можете сделать это, используя MVC 2 (если это возможно), если вы передадите пользовательскую ViewModel в представление.

using System.ComponentModel;

 public class PersonViewModel
    {
        public PersonViewModel(string name)
        {
            this.Name = name;
        }

        [DisplayName(".Display Anything You Like Here.")]
        public string Name { get; set; }
1 голос
/ 30 июня 2010

Вы можете создать String.ascx в папке DisplayTemplates и предоставить свою собственную реализацию.См. Раздел Переопределение шаблонов в следующей статье.

http://bradwilson.typepad.com/blog/2009/10/aspnet-mvc-2-templates-part-1-introduction.html

0 голосов
/ 30 июня 2010

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

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