2012-05-27 125 views
2

我有以下问题。ASP .NET MVC 3自定义Html 5数据属性使用C#

我有,我想贴上数据 - 属性和特定的类像这样的HTML元素:

<element id="" class="custom_class" data-attribute="value" data-attr-two="value2"></element> 

,但我想在模型级别定义这些属性,像这样:

public class ModelName 
{ 
    [DataAnnotation({attribute = "value", attr_2 = "value2"})] 
    [Class= "custom_class"] 
    public type PropertyName { get; set;} 
} 

我知道自定义验证属性,但问题是他们的元素看起来是这样的:

<element id="" class="custom_class" data-val-attribute="value"/></element> 

而不是这个:

<element id="" class="custom_class" data-attribute="value"/></element> 

如果有另一种方式来做到这一点像也许增加一个字典HTML辅助就像这样:

@Html.TextBoxFor(model => Model, new { DataAnnotation : DataAnnotationObjectModel.Create({Message =  "something", Name = "something" })) 

的DataAnnotationObject是一类与所有类型的data-attributes id正在使用,并且一些方法将创建预先枚举重复数据的默认对象。

我知道我能做到这一点:

@Html.TextBoxFor(model => Model, new { data_attr = @item.Value } ) 

但我要去必须添加5点或更多的属性,并在每一个模型中的每个属性,我希望把它做的和IM将不得不这样做每个物业至少3次。

有没有办法做到这一点?

如果你有一些很难理解这个问题,请随时发表评论,如果您有问题,我会尽我所能解释

回答

1

作为一个快速解决方案,您可以尝试定义HTML助手这样的;

public static MvcHtmlString AttributedTextBoxFor<TModel, TProperty>(this HtmlHelper _helper, Expression<Func<TModel, TProperty>> expression) 

在你应该能够检索属性的代码从表达式(按照这个StackOverflow的question)被引用,并通过使用反射,你应该能够再次获得属性该属性(PropertyInfo.Attributes) 。一旦你拥有了这些,你应该能够产生与定义的所有“数据 - ”属性的匿名对象,并从上述定义你的助手,返回标准TextBoxFor,并通过在这个对象:

return _helper.TextBoxFor(expression, myHtmlAttributes); 

没有有足够的时间来编写完整的解决方案,但它应该只是几行样板代码。

+0

这是一个可行的解决方案。唯一的问题是,我将不得不像这样为所有其他html助手编写重载。如果我最终没有找到任何其他替代方案,这将是我将遵循的路线 – S3cretz

+0

或者,您可以调查使用“EditorFor()”辅助方法并为您的属性类型创建EditorTemplates。我知道Editor模板在运行时接收属性名称来生成ID,但我不知道它可以获取完整的属性Info和Attributes。如果是这样,你应该可以只用EditorTemplates。 – Tallmaris