【问题标题】:ModelMetadata additional attributes is always emptyModelMetadata 附加属性始终为空
【发布时间】:2017-04-02 19:27:22
【问题描述】:

我正在尝试访问模型的元数据属性以创建一个帮助程序,以根据 DataAnnotations 自动添加 HtmlAttributes。

问题是,属性总是空的。

我有 2 个基本课程可以尝试一个空项目:

namespace MegaInterestingProject
{
    public class HomeController : Controller
    {
        public string Index()
        {
            var model = ModelMetadata.FromLambdaExpression<HomeModel, string>(x => x.User, new ViewDataDictionary<HomeModel>());

            return model.Description;
        }
    }

    public class HomeModel
    {
        [Required]
        [MaxLength(13)]
        [MinLength(11)]
        [DisplayName("displayname")]
        [Description("description")]
        public string User { get; set; }
    }
}

这里model.Description总是空的,AdditionalValues字典总是空的。

这里可能缺少什么?

这是我在 GitHub 上添加的一个参考项目:https://github.com/erickgirard/TestHtmlAttributesHelper

【问题讨论】:

    标签: asp.net-mvc data-annotations modelmetadata


    【解决方案1】:

    您使用错误的属性生成ModelMetadata。您需要在System.ComponentModel.DataAnnotations 中使用DisplayAttribute(而不是在System.ComponentModel 中使用DisplayNameAttribute。

    public class HomeModel
    {
      [Display(Name = "displayname", Description = "description")]
      public string User { get; set; }
    }
    

    【讨论】:

      【解决方案2】:

      您没有将属性放在模型上,而是放在模型的属性上。

      访问模型中属性元数据的自定义帮助函数如下所示:

      public static MvcHtmlString CustomHelperFunctionFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression)
      {
          var propertyName = ExpressionHelper.GetExpressionText(expression);
          var metadata = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);
          var displayname = metadata.DisplayName;
          var description = metadata.Description;
      
          return new MvcHtmlString("have fun!");
      }
      

      【讨论】:

      • 为什么要声明一个propertyName变量?你好像真的没用过?此外,我已经采用了通用方式,并且已经使用此结构完成了扩展方法,但属性仍然为空。
      • 没错,这是我的一个实际函数中的一些代码,我粘贴并修改了这些代码以进行说明。但我留下它是为了说明您如何知道您实际使用的模型中的哪些属性。这是可用于扩展 @Htmlhelper 的 html 辅助函数的代码。但重点是:您正在尝试从模型级别读取元数据,而实际属性值位于 model.property 级别。
      • 我复制并粘贴了您的代码。还是空的。我用 github 上的一个测试项目编辑了我的第一篇文章
      • 好主意,提交了拉取请求。
      • 合并可能对显示和描述有用,但核心问题(AdditionalValues 字典为空)仍然存在。我仍然无法访问 MaxLength 属性或任何其他属性。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多