CustomAttribute reflete o atributo html MVC5

Na esperança de encontrar um caminho quando no MVC5 um atributo Custom ou preferencialmente o RegularExpressionAttribute decora uma propriedade no modelo, o controle html irá contê-lo como outro atributo do controle. Por exemplo

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

saídas …

  

Ou algo assim. Portanto, para o RegularExpressionAttribute, o atributo pattern será incrível.

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

saídas …

  

Eu preciso dessa saída sem habilitar a opção não-intrusiva de Javascript. Então, estou pensando em especificar um atributo no modelo que é empurrado para baixo na exibição. Não tenho certeza se o provedor de annotations de dados poderia fazer esse trabalho. Não tenho certeza se um Ajudante pode ser estendido para obter esse resultado.

Ajuda é apreciada.

Se o uso dos auxiliares padrão com a sobrecarga para adicionar atributos html não for aceitável, você poderá criar um atributo que implemente o IMetadataAware que adiciona propriedades aos metadata.AdditionalValues que podem ser usados ​​em helpers html personalizados. Um exemplo simples pode 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; } } } 

e para criar um ajudante para renderizar uma checkbox de texto (apenas uma sobrecarga mostrada aqui)

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

e usá-lo como

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

e na visão

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

para tornar isso um pouco mais flexível, você poderia adicionar mais propriedades ao atributo para poder aplicá-lo como

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

e modifique o auxiliar para renderizar todos os atributos html definidos.