CustomAttribute refleja el atributo html MVC5

Esperando encontrar una forma cuando en MVC5 un atributo personalizado o preferiblemente el RegularExpressionAttribute decora una propiedad en el modelo, el control html lo contendrá como otro atributo del control. P.ej

class CoolModel { [CustomHtmlAttribute("hello")] public string CoolValue {get;set;} } 

salidas …

  

O algo así. Entonces, para el atributo RegularExpressionAttribute, el atributo de patrón será impresionante.

 class CoolModel { [RegularExpressionAttribute("/d")] public string CoolValue {get;set;} } 

salidas …

  

Necesito esta salida sin habilitar la opción discreta de Javascript. Así que estoy pensando en una forma de especificar algún atributo en el modelo que se empuja hacia la vista. No estoy seguro de si el proveedor de anotaciones de datos podría hacer este trabajo. No estoy seguro de si se puede extender un Ayudante para obtener este resultado.

La ayuda es apreciada.

Si no se aceptan los helpers estándar con la sobrecarga para agregar atributos html, entonces puede crear un atributo que implemente IMetadataAware que agregue propiedades a metadata.AdditionalValues IMetadataAware que luego se pueden usar en helpers personalizados. Un ejemplo simple podría ser

 [AttributeUsage(AttributeTargets.Property)] public class CustomHtmlAttribute : Attribute, IMetadataAware { public static string ValueKey { get { return "Value"; } } public string Value { get; set; } public void OnMetadataCreated(ModelMetadata metadata) { if (Value != null) { metadata.AdditionalValues[ValueKey] = Value; } } } 

y crear un ayudante para representar un cuadro de texto (solo se muestra una sobrecarga aquí)

 public static MvcHtmlString CustomHtmlTextBoxFor(this HtmlHelper helper, Expression> expression) { ModelMetadata metaData = ModelMetadata.FromLambdaExpression(expression, helper.ViewData); object attributes = null; if (metaData.AdditionalValues.ContainsKey(ValueKey)) { attributes = new { customhtml = (string)metaData.AdditionalValues[ValueKey] }; } return InputExtensions.TextBoxFor(helper, expression, attributes); } 

y usarlo como

 [CustomHtml(Value = "hello")] public string CoolValue { get; set; } 

y en la vista

 @Html.CustomHtmlTextBoxFor(m => m.CoolValue) 

para hacer esto un poco más flexible, podría agregar más propiedades al atributo para que pueda aplicarlo como

 [CustomHtml(Value = "hello", Pattern="/d")] public string CoolValue { get; set; } 

y modifique el helper para representar todos los atributos html que defina.