Asp.net mvc 我可以更改LabelFor在MVC中的渲染方式吗?

Asp.net mvc 我可以更改LabelFor在MVC中的渲染方式吗?,asp.net-mvc,asp.net-mvc-2,Asp.net Mvc,Asp.net Mvc 2,我想更改LabelFor渲染的方式。我可以用DisplayTemplate来做吗 LabelFor生成一个标签标签,我想在标签的末尾添加一个“:” 谢谢大家! alex您可以在DisplayTemplates文件夹中创建String.ascx,并提供自己的实现。请参阅下文的覆盖模板部分 我认为最好的方法是编写自己的helper方法来呈现您喜欢的内容。您可以重载现有方法,也可以简单地创建一个新方法。如果将自定义ViewModel传递给视图,则可以使用MVC 2(如果可能)执行此操作 using S

我想更改LabelFor渲染的方式。我可以用DisplayTemplate来做吗

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

谢谢大家!


alex

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


我认为最好的方法是编写自己的helper方法来呈现您喜欢的内容。您可以重载现有方法,也可以简单地创建一个新方法。

如果将自定义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; }

只需在纯HTML中编写一个常规的
元素:

<label>My Label:</label>
然后,您可以在视图中这样使用:

<label for="<%= Html.FieldIdFor(m => m.EmailAddress) %>">E-mail address:</label> 
<%= Html.TextBoxFor(m => m.EmailAddress) %>
电子邮件地址:
m、 电子邮件地址)%>

其他的帖子涵盖了不同的方法,它们都同样有效,你选择哪一个是个人喜好的问题。我个人更喜欢将
编写为纯HTML,因为它使设计师在更改标记、添加额外属性(如CSS类等)时具有更大的灵活性。此外,我觉得标签文本是一个视图问题,不应该在ViewModel类上修饰,但这只是我个人的观点/偏好,我知道这里有些人会不同意我的观点,这很好:-)

这里有一个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));
    }
}
公共静态类标签扩展{
[SuppressMessage(“Microsoft.Design”、“CA1006:DoNotNestGenericTypesInMemberSignatures”,justionment=“这是一种适当的泛型类型嵌套”)]
公共静态MvcHtmlString SmartLabelFor(此HtmlHelper html,表达式){
返回LabelHelper(html,
ModelMetadata.FromLambdaExpression(表达式,html.ViewData),
GetExpressionText(表达式));
}
内部静态MvcHtmlString LabelHelper(HtmlHelper html、ModelMetadata元数据、字符串htmlFieldName){
字符串labelText=metadata.DisplayName??metadata.PropertyName??htmlFieldName.Split('.').Last();
if(String.IsNullOrEmpty(labelText)){
返回MvcHtmlString.Empty;
}
//为必填字段取消注释(如果需要*)
//如果(metadata.IsRequired)labelText=labelText+“*”;
labelText=labelText+“:”;
标记生成器标记=新标记生成器(“标签”);
tag.Attributes.Add(“for”,html.ViewContext.ViewData.TemplateInfo.getFullHtmlFieldDid(htmlFieldName));
tag.SetInnerText(labelText);
返回MvcHtmlString.Create(tag.ToString(TagRenderMode.Normal));
}
}
要使用它:

<%:Html.SmartLabelFor(m => m.FirstName)%>
m.FirstName)%%>
它将提供:

<label for="FirstName">First Name:</label>
名字:
或者,如果您取消注释所需的相关字段*

<label for="FirstName">First Name *:</label>
名字*:

我喜欢这个。我想这将是我做这件事的方式。。通过覆盖或创建一个新的,我将我想要的。这是伟大的!现在正在mvc2应用程序中使用。谢谢,谢谢!这太棒了。你还帮我用模型元数据减少了属性查找代码,甜心!
<label for="FirstName">First Name *:</label>