Html.Labelfor使用对象的DisplayName代替属性给定一个viewmodel是这样的:publicclassParentViewModel{publicobjectChildViewModel{get;放;如果我像这样使用Html.LabelFor:@Html.LabelFor(model=>model.ChildViewModel)我会得到这样的输出:ChildViewModel我真正想要的是生成的标签使用应用于对象EG的DisplayName属性[DisplayName("MyCustomLabel")]publicclassChildViewModel{}输出:我的自定义标签我知道Html.LabelFor方法采用一个表达式,该表达式需要一个属性,它将在该属性上查找DisplayName属性而不是对象本身。我创建了一个Html辅助方法来实现我想要的:publicstaticIHtmlStringCreateLabel(thisHtmlHelperhtml,Funcfunc)whereTModel:class{TagBuildertb=newTagBuilder("label");varmodel=html.ViewData.ModelasTModel;如果(模型!=null){objectobj=func(模型);if(obj!=null){varattribute=obj.GetType().GetCustomAttributes(typeof(DisplayNameAttribute),true).FirstOrDefault()asDisplayNameAttribute;如果(属性!=null){tb.InnerHtml=attribute.DisplayName;返回MvcHtmlString.Create(tb.ToString());}else{tb.InnerHtml=obj.ToString();返回MvcHtmlString.Create(tb.ToString());}}}tb.InnerHtml=html.ViewData.Model.ToString();返回MvcHtmlString.Create(tb.ToString());我的助手没有使用表达式,而是使用Func,它返回我想要检查DisplayName属性的对象。我遇到的第一个问题是当我尝试用剃刀调用此方法时:@Html.CreateLabel(model=>model.ChildObject)我收到以下错误:方法'CreateLabel(thisHtmlHelper,Func)的类型参数不能是从用法推断。尝试明确指定参数。'所以我改为调用这样的方法:@{Html.CreateLabel(model=>model.ChildObject);但是没有渲染。如果我使用调试器逐步执行我的帮助程序方法,则会生成label标签,但在呈现页面时不会显示任何内容。所以我的问题是:更新我想我会发布最终代码,因为我做了一些小改动。首先,我查看了MVC源代码中的帮助程序,并决定将该方法拆分为三个独立的方法,与提供的示例一致。我还删除了所有TagBuilder内容,因为我真正需要的是生成要在标签之间注入的文本。最终代码如下。再次感谢Sylon帮助我解决这个问题。publicstaticIHtmlStringLegendTextFor(thisHtmlHelperhtml,Expressionexpression){返回LegendTextHelper(html,ModelMetadata.FromLambdaExpression(expression,html.ViewData),ExpressionHelper.GetExpressionText(expression),expression.Compile().Invoke(html.ViewData)。模型));}privatestaticIHtmlStringLegendTextHelper(thisHtmlHelperhtml,ModelMetadatametadata,stringhtmlFieldName,TObjectvalue){stringresolvedLabelText=metadata.DisplayName??值.GetDisplayName()??元数据.PropertyName??htmlFieldName.Split('.').Last();如果(String.IsNullOrEmpty(resolvedLabelText))返回MvcHtmlString.Empty;返回MvcHtmlString.Create(resolvedLabelText);}privatestaticstringGetDisplayName(thisTobj){if(obj!=null){varattribute=obj.GetType().GetCustomAttributes(typeof(DisplayNameAttribute),false).Cast().FirstOrDefault();返回属性!=null?attribute.DisplayName:null;}else{返回空值;}}我刚刚为Label创建一个自定义的Html帮助程序来执行您想要的操作:字符串customDisplayName=null;varvalue=expression.Compile().Invoke(html.ViewData.Model);if(value!=null){varattribute=value.GetType().GetCustomAttributes(typeof(DisplayNameAttribute),false).Cast().FirstOrDefault();customDisplayName=attribute!=null?attribute.DisplayName:null;}stringhtmlFieldName=ExpressionHelper.GetExpressionText(表达式);stringlabelText=metadata.DisplayName??自定义显示名称??元数据。属性名??htmlFieldName.Split('.').Last();如果(String.IsNullOrEmpty(labelText)){返回MvcHtmlString.Empty;}TagBuildertag=newTagBuilder("label");tag.Attributes.Add("for",html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldId(html字段名));tag.SetInnerText(labelText);返回MvcHtmlString.Create(tag.ToString(TagRenderMode.Normal));}}我的示例模型:publicclassParent{publicobjectChild{get;放;}}[DisplayName("yo")]publicclassChild{publicintId{get;放;}}View:以上就是C#学习教程:Html.Label使用对象的DisplayName代替属性,分享所有内容,如果对大家有用,需要详细了解C#学习教程,希望大家付费更多关注—@Html.LabelForCustom(m=>m.Child)@*prints哟*@本文收集自网络,不代表立场。如涉及侵权请点击维权联系管理员删除如需转载请注明出处: