我可以改变MVC中LabelFor渲染的方式吗?

时间:2010-06-30 12:51:59

标签: asp.net-mvc asp.net-mvc-2

我想改变LabelFor渲染的方式。我可以使用DisplayTemplate吗?

LabelFor生成标签标签,我想在标签的末尾添加“:”。

谢谢你!

亚历

5 个答案:

答案 0 :(得分:7)

这是一个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>

答案 1 :(得分:2)

只需在纯HTML中编写常规<label>元素:

<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类,但这只是我个人的意见/偏好,我知道这里的一些人会不同意我的意见,这很好: - )

答案 2 :(得分:1)

您可以在DisplayTemplates文件夹中创建String.ascx并提供您自己的实现。请参阅以下文章的覆盖模板部分。

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

答案 3 :(得分:1)

如果将自定义ViewModel传递给视图,则可以使用MVC 2(如果可能)执行此操作。

using System.ComponentModel;

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

        [DisplayName(".Display Anything You Like Here.")]
        public string Name { get; set; }

答案 4 :(得分:0)

我认为最好的方法是编写自己的帮助方法来呈现你喜欢的东西。您可以重载现有方法或只创建一个新方法。