MVC 5 使用自定义数据注释添加 'data-' 属性

MVC 5 Add 'data-' attribute with Custom Data Annotation

我有一个输入文本字段,我希望能够在用户编辑文本后恢复初始值。 所以,我会说添加一个 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} 将从 属性 的值中获取,还有一个选项可以覆盖它。

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

感谢各位帮手

即使您要创建一个需要实现 MetadataAware in order to add the value to the AdditionalValues property of ModelMetadata 的自定义属性,您仍然需要创建自己的扩展方法来读取该值并将其添加到 htmlAttributes .

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

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

因此,对于您的 @Html.TextBoxFor(m => 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);

试试这个,使用 htmlAttributes 作为 IDictionary

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