Asp.net mvc MVC 5新增';数据-';具有自定义数据注释的属性

Asp.net mvc MVC 5新增';数据-';具有自定义数据注释的属性,asp.net-mvc,asp.net-mvc-5,metadata,data-annotations,Asp.net Mvc,Asp.net Mvc 5,Metadata,Data Annotations,我有一个输入文本字段,我希望能够在用户编辑文本后恢复初始值。 因此,我想添加一个data-{something}属性,例如datainit,它将保存初始值,以便以后可以恢复 结果应该如下所示: <input type="text" val="Some value..." data-init="Some value..." /> 但这很糟糕,我有很多这样的输入字段 另外,我无法创建自定义的HtmlHelper,因为我有许多具有这种行为的输入类型,如果我这样做的话,它将非常混乱 因此,

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

结果应该如下所示:

<input type="text" val="Some value..." data-init="Some value..." />
但这很糟糕,我有很多这样的输入字段

另外,我无法创建自定义的HtmlHelper,因为我有许多具有这种行为的输入类型,如果我这样做的话,它将非常混乱

因此,我认为实际的解决方案应该是使用数据注释

[HoldInitialValue]
属性将负责将
data init=“{value}”
添加到输入标记。{value}将从属性的值中获取,并带有覆盖它的选项

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


感谢您的帮助。

即使您要创建一个自定义属性(需要实现该属性才能将值添加到的
AdditionalValues
属性),您仍然需要创建自己的扩展方法来读取该值并将其添加到
htmlAttributes

有关如何实现它的示例,请参阅

但是,这是不必要的,因为HTML输入已经存储了初始值。对于
(复选框除外)或
默认值
。对于
默认值选中
,对于
默认值选中

因此,对于
@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);

试试这个,使用HtmlatAttributes作为IDictionary

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

通过编写自定义的HtmlHelper。你知道怎么做吗?@IvayloStoev-是的,我知道,我拒绝了HtmlHelper解决方案,因为我有许多具有这种行为的输入类型,如果我这样做的话会非常混乱……如果你想使用这样的数据注释,必须有人对其进行评估。这通常是一个助手。我看不到任何其他有意义的扩展点。另一种选择(不是真正的MVC方式)是从客户端执行,并在首次呈现html元素时添加初始值,方法是使用一些javascript代码,例如基于一些常见的css类。
var element = $('#InputText');
var initialValue = element.prop('defaultValue');
// reset to initial value
element.val(initialValue);
@Html.TextBoxFor(m => m.InputText , new Dictionary<string,object>()
               {
                   { "data-init", Model.InputText}
               })