15

编辑器的数据属性不工作。

@Html.EditorFor(model => model.SireTag, new { data_typeahead = "dsfsdfsd" })

当我打开我的 chrome 浏览器时,我看不到我的文本框的任何数据属性。我尝试了护目镜,但没有发现任何有用的东西。

4

2 回答 2

30

实际上,您可以使用 EditorFor 并发送额外的 HTML 属性。使用此重载并设置additionalViewData参数。它需要一个具有htmlAttributes属性的对象:

@Html.EditorFor(
    model => model.SireTag,
    new { 
        htmlAttributes = new { data_typeahead = "dsfsdfsd" }
    }
)

这将产生类似的东西:

<input id="SireTag" name="SireTag" ... data-typeahead="dsfsdfsd">
于 2015-10-13T19:20:03.420 回答
14

第二个object参数Html.EditorFor不是用于 HTML 属性,而是用于附加视图数据。EditorFor助手不允许以例如更具体的助手<input>所做的方式自定义 HTML 属性 - 他们从模型元数据(例如[Attributes])中获取大部分设置。

“修复”的最简单方法显然是下降EditorFor

@Html.TextBoxFor(model => model.SireTag, new { data_typeahead = "dsfsdfsd" })

或者,为该属性编写您自己的 EditorTemplate。这可以允许您通过从(或“预先输入”)检索data_typeahead值来使用(或简化)原始语法。ViewData["data_typeahead"]

更进一步,更高级,您可以将自己Attribute的属性应用于您的模型属性 + 您自己的ModelMetadataProvider(或者 - 更简单 - 使用IMetadataAware,更多内容见下文)将其转换为 EditorTemplate 可以使用的元数据 - 这是为了删除完全从您的视图中决定data-属性,将您的调用变成:

@Html.EditorFor(model => model.SireTag)

...和你的模型变成这样的:

public class MyModel
{
    [Typeahead("dsfsdfsd")]
    public string SireTag { get; set; }
}

此方法使用 IMetadataAware 的示例:

[AttributeUsage(AttributeTargets.Property)]
public class TypeaheadAttribute : Attribute, IMetadataAware
{
    private readonly string value;

    public TypeaheadAttribute(string value)
    {
       this.value = value;
    }

    public void OnMetadataCreated(ModelMetadata metadata)
    {
        metadata.AdditionalValues["typeahead"] = value;
    }
}

然后可以使用ViewContext.ViewData.ModelMetadata.AdditionalValues(字典)在 EditorTemplate 中提取此元数据条目,并将结果添加到传递给 eg 的属性字典中Html.TextBox

于 2013-08-11T22:48:52.850 回答