C# 从模型元数据解析元数据displayname?
我使用了一个附加参数进行了标签扩展,但是当我使用ViewData.ModelMetadata.DisplayName时,我没有从模型的diplsy属性中获取显示名称 我的模型有这样一个用户名C# 从模型元数据解析元数据displayname?,c#,asp.net-mvc-3,html-helper,C#,Asp.net Mvc 3,Html Helper,我使用了一个附加参数进行了标签扩展,但是当我使用ViewData.ModelMetadata.DisplayName时,我没有从模型的diplsy属性中获取显示名称 我的模型有这样一个用户名 [Display(Name = "User name")] public string UserName { get; set; } @Html.LabelFor(m => m.SetupModel.UserName, @<span>No fancy characters
[Display(Name = "User name")]
public string UserName { get; set; }
@Html.LabelFor(m => m.SetupModel.UserName, @<span>No fancy characters mmkay?</span>)
是这样使用的
[Display(Name = "User name")]
public string UserName { get; set; }
@Html.LabelFor(m => m.SetupModel.UserName, @<span>No fancy characters mmkay?</span>)
@Html.LabelFor(m=>m.SetupModel.UserName,@No-fancy-characters-mmkay?)
使用这个html助手
public static MvcHtmlString LabelFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> ex, Func<object, HelperResult> template, string labelText = null) {
var htmlFieldName = ExpressionHelper.GetExpressionText(ex);
var metadata = htmlHelper.ViewData.ModelMetadata;
string resolvedLabelText = labelText ?? metadata.DisplayName ?? metadata.PropertyName ?? htmlFieldName.Split('.').Last();
if (String.IsNullOrEmpty(resolvedLabelText)) {
return MvcHtmlString.Empty;
}
var tag = new TagBuilder("label");
tag.Attributes.Add("for", TagBuilder.CreateSanitizedId(htmlHelper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(htmlFieldName)));
tag.InnerHtml = string.Format(
"{0} {1}",
resolvedLabelText,
template(null).ToHtmlString()
);
return MvcHtmlString.Create(tag.ToString());
}
公共静态MvcHtmlString LabelFor(此HtmlHelper HtmlHelper,表达式ex,Func模板,字符串labelText=null){
var htmlFieldName=ExpressionHelper.GetExpressionText(ex);
var metadata=htmlHelper.ViewData.ModelMetadata;
字符串resolvedLabelText=labelText??metadata.DisplayName??metadata.PropertyName??htmlFieldName.Split('.').Last();
if(String.IsNullOrEmpty(resolvedLabelText)){
返回MvcHtmlString.Empty;
}
var标记=新标记生成器(“标签”);
tag.Attributes.Add(“for”,TagBuilder.CreateSanitizedId(htmlHelper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(htmlFieldName));
tag.InnerHtml=string.Format(
"{0} {1}",
resolvedLabelText,
模板(null).ToHtmlString()
);
返回MvcHtmlString.Create(tag.ToString());
}
但是结果是用户名没有花哨的字符,嗯?当我认为它应该显示在显示属性中设置的名称时?当我发布上一个答案时,我忽略了一个事实,即viewmodel中有不同的对象。下面只是为了说明这个想法,应该有更好的方法来做到这一点 这就是诀窍:
var metadata = ModelMetadata.FromLambdaExpression(ex, htmlHelper.ViewData);
var resolvedLabelText = labelText ?? metadata.DisplayName ?? metadata.PropertyName ?? htmlFieldName.Split('.').Last();
例如,SomeObject.SomeObject.Propery
,上述方法不适用。
以防万一在MVC4中它非常简单
@ViewData.ModelMetadata.PropertyName
@ViewData.ModelMetadata.DisplayName
我得到的序列不包含匹配元素异常,因为我在此视图中使用的模型类型为SetupViewModel,其中包含配置模型和RegisterModel。建议的代码查询是一个名为“SetupModel.UserName”的属性。公共类SetupViewModel{public Configuration.Configuration Configuration{get;set;}公共注册表模型SetupModel{get;set;}}我更新了我的答案,这只是为了让您走上正确的道路,它在您的示例中可以工作,但仅此而已。元数据是嵌套的,因此可以说……谢谢,这就成功了。正如你所说的,感觉必须有更好的方法来实现这一点,这样它也可以在任何属性上工作。找到了更好的方法来获取元数据,所以我再次更新了答案。