【问题标题】:ASP .NET MVC 3 Custom Html 5 Data- Attributes using C#使用 C# 的 ASP .NET MVC 3 自定义 Html 5 数据属性
【发布时间】:2012-05-27 15:33:01
【问题描述】:

我有以下问题。

我有 Html 元素,我想添加 Data- 属性和一个特定的类来喜欢这样:

<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 将是一个类,其中包含所有类型的数据属性 id 正在使用,并且一些方法创建默认对象,这些对象使用重复数据预先枚举。

我知道我能做到:

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

但我必须为每个模型中的每个属性添加 5 个或更多属性,并且我必须为每个属性添加至少 3 次。

有没有办法做到这一点?

如果您在理解这个问题时遇到问题,请随时发表您的问题的评论,我会尽力解释

【问题讨论】:

    标签: c# asp.net-mvc asp.net-mvc-3 html data-annotations


    【解决方案1】:

    作为一种快速解决方案,您可以尝试像这样定义一个 HTML Helper;

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

    在代码中,您应该能够检索从表达式中引用的属性(按照 StackOverflow question),并且通过使用反射,您应该能够再次获取该属性的属性(PropertyInfo.Attributes)。一旦你有了这些,你应该能够生成一个定义了所有“data-”属性的匿名对象,并从上面定义的帮助器中返回标准的 TextBoxFor 并传入这个对象:

    return _helper.TextBoxFor(expression, myHtmlAttributes);
    

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

    【讨论】:

    • 这是一个可行的*解决方案。唯一的问题是我必须为所有其他 html 助手编写这样的重载。如果我最终没有找到任何其他选择,这将是我要遵循的路线
    • 另外,您可以调查“EditorFor()”辅助方法的使用并为您的属性类型创建 EditorTemplates。例如,我知道编辑器模板在运行时接收属性名称以生成 ID,但我不知道它可以获取完整的属性信息和属性。如果是这样,您应该可以只使用 EditorTemplates。
    猜你喜欢
    • 2016-12-12
    • 1970-01-01
    • 1970-01-01
    • 2012-03-03
    • 1970-01-01
    • 1970-01-01
    • 2016-05-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多