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.)?