【问题标题】:MVC 5 Add 'data-' attribute with Custom Data AnnotationMVC 5 使用自定义数据注释添加“数据-”属性
【发布时间】:2017-10-30 14:59:58
【问题描述】:

我有一个输入文本字段,我希望能够在用户编辑文本后恢复初始值。 所以,我会说添加一个data-{something} 属性,例如data-init,它将保存初始值,以便以后可以恢复。

结果应如下所示:

<input type="text" val="Some value..." data-init="Some value..." />

现在,我知道我可以通过以下方式实现:

@Html.TextBoxFor(m => m.InputText , new { data_init = Model.InputText })

但这很糟糕,而且我有很多具有这种行为的输入字段。

另外,我无法创建自定义 HtmlHelper,因为我有很多具有这种行为的输入类型,如果我这样做会很混乱......

所以,我认为实际的解决方案应该是使用Data Annotations

public class ExampleVM
{
    [HoldInitialValue]
    public string InputText { get; set; }
}

[HoldInitialValue] 属性将负责将data-init="{value}" 添加到输入标签。 {value} 将从属性的值中获取,还可以选择覆盖它。

那么,我该如何实现这种行为呢?

感谢帮助。

【问题讨论】:

  • 通过编写自定义 HtmlHelper。你知道怎么做吗?
  • @IvayloStoev - 是的,我知道,我拒绝了 HtmlHelper 解决方案,因为我有很多具有这种行为的输入类型,如果我这样做会很混乱......
  • 如果您想使用这样的数据注释,则必须有人对其进行评估。这通常是一个助手。我没有看到任何其他有意义的扩展点。另一种选择(不是真正的 MVC 方式)是从客户端执行此操作,并在第一次渲染 html 元素时添加初始值,方法是使用一些 javascript 代码并基于例如一些常见的 css 类。

标签: asp.net-mvc asp.net-mvc-5 metadata data-annotations


【解决方案1】:

即使您要创建自定义属性,需要实现 MetadataAware 以便将值添加到 ModelMetadataAdditionalValues 属性,您仍然需要创建自己的扩展方法来读取该值并将其添加到htmlAttributes

有关如何实现它的示例,请参阅CustomAttribute reflects html attribute MVC5

但是,这是不必要的,因为 HTML 输入已经存储了初始值。对于&lt;input&gt;(复选框除外)或&lt;textarea&gt;defaultValue。对于&lt;input type="checkbox" /&gt;defaultChecked&lt;select&gt;defaultSelected

所以对于您的@Html.TextBoxFor(m =&gt; m.InputText),您可以使用例如

使用javascript

var element = document.getElementById ("InputText");
var initialValue = elem.defaultValue;
// reset to initial value
element.value = initialValue;

或使用 jQuery

var element = $('#InputText');
var initialValue = element.prop('defaultValue');
// reset to initial value
element.val(initialValue);

【讨论】:

    【解决方案2】:

    试试这个,使用 htmlAttributes 作为 IDictionary

    @Html.TextBoxFor(m => m.InputText , new Dictionary<string,object>()
                   {
                       { "data-init", Model.InputText}
                   })
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-09
      • 1970-01-01
      相关资源
      最近更新 更多