Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从模型元数据解析元数据displayname?_C#_Asp.net Mvc 3_Html Helper - Fatal编程技术网

C# 从模型元数据解析元数据displayname?

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

我使用了一个附加参数进行了标签扩展,但是当我使用ViewData.ModelMetadata.DisplayName时,我没有从模型的diplsy属性中获取显示名称

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

    [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;}}我更新了我的答案,这只是为了让您走上正确的道路,它在您的示例中可以工作,但仅此而已。元数据是嵌套的,因此可以说……谢谢,这就成功了。正如你所说的,感觉必须有更好的方法来实现这一点,这样它也可以在任何属性上工作。找到了更好的方法来获取元数据,所以我再次更新了答案。