Asp.net mvc 我可以更改LabelFor在MVC中的渲染方式吗?
我想更改LabelFor渲染的方式。我可以用DisplayTemplate来做吗 LabelFor生成一个标签标签,我想在标签的末尾添加一个“:” 谢谢大家!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
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>