2014-10-23 3 views
2

В надежде найти способ, когда в MVC5 пользовательский атрибут или предпочтительнее RegularExpressionAttribute украшает свойство в модели, элемент управления html будет содержать его как еще один атрибут элемента управления. Например.CustomAttribute отражает атрибут html MVC5

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

выходы ...

<input type="text" customhtml="hello" /> 

Или что-то подобное. Таким образом, для атрибута RegularExpressionAttribute атрибут pattern будет потрясающим.

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

выходы ...

<input type="text" pattern="/d" /> 

мне нужен этот вывод без включения ненавязчивый опцию Javascript. Поэтому я думаю, чтобы указать какой-то атрибут в модели, которая приближается к представлению. Не уверен, что поставщик аннотаций данных мог бы выполнить это задание. Не уверен, что помощник может быть расширен, чтобы получить этот результат.

Справка приветствуется.

+1

Для этого вы можете просто использовать стандартные помощники и добавить атрибуты html '@ Html.TextBoxFor (m => m.SomeProperty, new {customhtml =" hello "})'. Выполнение этого с использованием пользовательских аннотаций данных будет намного сложнее –

+0

См. [Эту ссылку] (http://aspadvice.com/blogs/kiran/archive/2009/11/29/Adding-html-attributes-support-for-Templates- _2D00_-ASP.Net-MVC-2.0-Beta_2D00_1.aspx) – artm

+0

Спасибо за ответы. @StephenMuecke Я знаю об этом, но мне нужно указать атрибут в модели для удобства обслуживания. – user1791567

ответ

4

Если использование стандартных помощников с перегрузкой для добавления атрибутов html неприемлемо, вы можете создать атрибут, реализующий IMetadataAware, который добавляет свойства к metadata.AdditionalValues, которые затем могут использоваться в пользовательских хелм-хелперах. Простой пример может быть

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

и создать помощник для визуализации текстового поля (только один перегрузка показано здесь)

public static MvcHtmlString CustomHtmlTextBoxFor<TModel, TValue>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TValue>> 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); 
} 

и использовать его в качестве

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

и в представлении

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

к сделать это немного более гибким, вы можете добавить дополнительные свойства к атрибуту, чтобы вы могли применять его как

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

и модифицировать помощник для визуализации всех атрибутов HTML можно определить.

Смежные вопросы