tag net mvc custom asp c# razor html-helper asp.net-mvc-4

c# - net - razor mvc



Acceder a los atributos de Custom Html Helpers en asp.net mvc 4 razor (1)

El atributo [Display] enriquece los metadatos. Por lo tanto, podría obtener la información de los metadatos.

Por ejemplo, si desea recuperar el nombre para mostrar dentro del helper:

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)); } }

y luego si suponemos que tienes un modelo de vista:

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

podrías usar el helper en tu vista fuertemente tipada:

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

Supongamos ahora que escribió un atributo de metadatos personalizado:

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; } }

que usaste para decorar tu modelo con:

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

y luego dentro de su ayudante podría obtener el atributo personalizado:

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; } }

ACTUALIZAR:

Parece que necesita recuperar el mensaje Requerido. No tengo idea de por qué necesitas hacer esto en una ayuda personalizada, pero aquí hay un ejemplo de cómo podrías lograr eso:

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; } }

Creé HtmlHelper en el motor ASP.NET MVC 4 con vista de afeitar C #.
¿Puedo pasar la propiedad ver modelo a mi clase de ayuda?
Por ejemplo, tengo propiedad

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

¿Puedo pasar esta propiedad a mi ayudante algo como esto @Html.Example(model => model.Lastname) y luego obtener anotaciones de datos en helper (si se requiere este campo, ¿qué es el nombre para mostrar, etc.)?