在asp.net mvc 4 razor中访问Custom Html Helpers中的属性

我在ASP.NET MVC 4 razor视图引擎C#中创建了HtmlHelper。
我可以将视图模型属性传递给我的帮助程序类吗?
例如,我有财产

[Required] [Display(Name = "Your Lastname")] public string Lastname { get; set; } 

我可以将此属性传递给我的帮助程序,如@Html.Example(model => model.Lastname) ,然后在帮助程序中获取数据注释(如果需要此字段,则显示名称等等)?

[Display]属性丰富了元数据。 因此,您可以从元数据中获取信息。

例如,如果要检索帮助程序中的显示名称:

 public static class HtmlHelpers { public static IHtmlString Example( this HtmlHelper html, Expression> ex ) { var metadata = ModelMetadata.FromLambdaExpression(ex, html.ViewData); var displayName = metadata.DisplayName; return new HtmlString(html.Encode(displayName)); } } 

如果我们假设你有一个视图模型:

 public class MyViewModel { [Required] [Display(Name = "Your Lastname")] public string Lastname { get; set; } } 

您可以在强类型视图中使用帮助器:

 @model MyViewModel @Html.Example(x => x.Lastname) 

现在让我们假设你编写了一个自定义元数据属性:

 public class FooBarAttribute : Attribute, IMetadataAware { public FooBarAttribute(string bar) { Bar = bar; } public string Bar { get; private set; } public void OnMetadataCreated(ModelMetadata metadata) { metadata.AdditionalValues["foo"] = Bar; } } 

您以前使用以下方式装饰模型:

 public class MyViewModel { [Required] [FooBar("This is the bar")] public string SomeBar { get; set; } } 

然后在你的助手里面你可以获取自定义属性:

 public static class HtmlHelpers { public static IHtmlString Example( this HtmlHelper html, Expression> ex ) { var metadata = ModelMetadata.FromLambdaExpression(ex, html.ViewData); if (metadata.AdditionalValues.ContainsKey("foo")) { var foo = metadata.AdditionalValues["foo"] as string; return new HtmlString(html.Encode(foo)); } return MvcHtmlString.Empty; } } 

更新:

您似乎需要获取Required消息。 不知道为什么你需要在自定义帮助器中执行此操作,但这里有一个示例,您可以如何实现:

 public static class HtmlHelpers { public static IHtmlString Example( this HtmlHelper html, Expression> ex ) { var me = (ex.Body as MemberExpression); if (me != null) { var required = me .Member .GetCustomAttributes(typeof(RequiredAttribute), false) .Cast() .FirstOrDefault(); if (required != null) { var msg = required.FormatErrorMessage(me.Member.Name); return new HtmlString(html.Encode(msg)); } } return MvcHtmlString.Empty; } }