2012-05-27 92 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