2012-06-10 35 views
23

我已经在asp.net mvc 4剃须刀视图引擎c#中创建了HtmlHelper。在asp.net中访问属性从自定义Html Helper mvc 4剃须刀

我可以将视图模型属性传递给我的助手类吗?

例如,我有物业

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

我可以通过这个属性来帮助我这样的事情@ Html.Example(型号=> model.Lastname),比得到的数据anotations在助手(如果这字段是必需什么是显示名称等)?

由于

回答

38

[Display]属性丰富的元数据。所以你可以从元数据中获取信息。

例如,如果你想获取助手里面的显示名称:

public static class HtmlHelpers 
{ 
    public static IHtmlString Example<TModel, TProperty>(
     this HtmlHelper<TModel> html, 
     Expression<Func<TModel, TProperty>> 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<TModel, TProperty>(
     this HtmlHelper<TModel> html, 
     Expression<Func<TModel, TProperty>> 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; 
    } 
} 

UPDATE:

看来你n eed获取Required消息。不知道为什么你需要这样做在一个自定义的助手,但这里是一个例子,你可以实现这一点:

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

哇。我认为你真棒:)谢谢你 –

+0

,你能说我怎么能找到数据val所需的消息?我想得到这个消息>>> data-val-date =“字段BirthDate必须是日期。” data-val-required =“需要BirthDate字段 –

+0

'data-val-required'是一个客户端属性,我想你想获取Required属性使用的消息,我将用例如。 –