我想改变LabelFor渲染的方式。我可以使用DisplayTemplate吗?
LabelFor生成标签标签,我想在标签的末尾添加“:”。
谢谢你!亚历
答案 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)
我认为最好的方法是编写自己的帮助方法来呈现你喜欢的东西。您可以重载现有方法或只创建一个新方法。