从模型元数据中解析元数据displayname

本文关键字:元数据 displayname 模型 | 更新日期: 2023-09-27 18:08:04

我已经用一个额外的参数做了一个标签扩展,但是当我使用ViewData.ModelMetadata.DisplayName时,我没有从我的模型上的diapplsy属性获得显示名称?

我的模型有一个这样的用户名

    [Display(Name = "User name")]
    public string UserName { get; set; }

和像这样使用

@Html.LabelFor(m => m.SetupModel.UserName, @<span>No fancy characters mmkay?</span>)

使用这个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());
    }

但是结果是username没有花哨的字符,好吗?当我认为它应该显示名称设置在显示属性?

从模型元数据中解析元数据displayname

我错过了一个事实,你有不同的对象在你的视图模型当我张贴我以前的答案。以下只是为了说明这个想法,应该有更好的方法来做到这一点。

这就是诀窍:

var metadata = ModelMetadata.FromLambdaExpression(ex, htmlHelper.ViewData);
var resolvedLabelText = labelText ?? metadata.DisplayName ?? metadata.PropertyName ?? htmlFieldName.Split('.').Last();

<罢工>

string resolvedLabelText = "";
if (htmlFieldName.Contains('.'))
{
    var model = htmlFieldName.Split('.');
    var metadata = htmlHelper.ViewData.ModelMetadata.Properties.FirstOrDefault(p => p.PropertyName == model[0] );
    if (metadata != null)
    {
        metadata = metadata.Properties.FirstOrDefault(p => p.PropertyName == model[1]);
        resolvedLabelText = labelText ?? metadata.DisplayName ?? metadata.PropertyName ?? htmlFieldName.Split('.').Last();
    }
    else
        resolvedLabelText = labelText ?? metadata.DisplayName ?? metadata.PropertyName ?? htmlFieldName.Split('.').Last();
}
else 
{
    var metadata = htmlHelper.ViewData.ModelMetadata.Properties.First(p => p.PropertyName == htmlFieldName);
    resolvedLabelText = labelText ?? metadata.DisplayName ?? metadata.PropertyName ?? htmlFieldName.Split('.').Last();
}
例如,上面的

将不适用于SomeObject.SomeObject.Propery

以防万一在MVC4中它非常简单

@ViewData.ModelMetadata.PropertyName
@ViewData.ModelMetadata.DisplayName