【问题标题】:ShortName in the Display attribute (DataAnnotations)Display 属性中的 ShortName (DataAnnotations)
【发布时间】:2014-06-11 05:34:04
【问题描述】:

Name 属性可以正常工作,但 ShortName 不起作用。

[Display(Name = "Date of the transfer the task", ShortName = "Trans date")]
public DateTime TransferDate { get; set; }

即使我删除 Name 属性,ShortName 也会被忽略(“TransferDate”显示在列标题中)。

在视图中我这样做:

@Html.DisplayNameFor(model => model.TransferDate)

【问题讨论】:

  • @scheien 这是否意味着不编写我自己的助手就不可能?我认为它也应该是自动的..
  • 根据那篇文章我猜是这样。您还在视图中引用了 DisplayName 属性 => @Html.DisplayNameFor(...)。老实说,我不知道 ShortName 的任何回退:-)

标签: c# asp.net-mvc asp.net-mvc-4 razor data-annotations


【解决方案1】:

如果您查看Display AttributeShortName property 的说明,您会发现它的开箱即用范围非常有限:

当然,这并不限制您在模型元数据上利用该值,但没有任何本地助手可以这样做。

Starting with MVC 2ModelMetadata 提供了两种访问底层数据的方法:FromStringExpressionFromLambdaExpression,因此您无需从头开始编写自己的帮助程序或扩展方法。

如果你讨厌编写 HTML 辅助方法,你可以全部内联:

@ModelMetadata.FromLambdaExpression<RegisterModel, string>( 
            model => model.TransferDate, ViewData).ShortDisplayName} )  

但添加扩展方法以实现访问一致性、代码去重和改进错误处理也是完全有效的

public static class MvcHtmlHelpers
{
   public static MvcHtmlString ShortNameFor<TModel, TValue>(this HtmlHelper<TModel> self, 
           Expression<Func<TModel, TValue>> expression)
   {
       var metadata = ModelMetadata.FromLambdaExpression(expression, self.ViewData);
       var name = metadata.ShortDisplayName ?? metadata.DisplayName ?? metadata.PropertyName;

       return MvcHtmlString.Create(string.Format(@"<span>{0}</span>", name));
   }
}

然后像任何其他辅助方法一样使用:

@Html.ShortNameFor(model => model.TransferDate)

进一步阅读

【讨论】:

  • 有针对 ASP.NET Core 的解决方案吗?
  • 我也在想办法在 Core 中做到这一点。如果有人知道如何,将不胜感激!
猜你喜欢
  • 1970-01-01
  • 2020-03-18
  • 1970-01-01
  • 2023-04-03
  • 2012-05-30
  • 1970-01-01
  • 2011-04-06
  • 2010-12-19
  • 1970-01-01
相关资源
最近更新 更多