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

の 2 番目のobjectパラメーターHtml.EditorForは HTML 属性用ではなく、追加のビュー データ用です。EditorForヘルパーは、たとえばより具体的なヘルパーが行う方法で HTML 属性をカスタマイズすることを許可しません。<input>設定のほとんどをモデル メタデータから取得します (例: [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;
    }
}

このメタデータ エントリは、(辞書) を使用して EditorTemplate で抽出できます。ViewContext.ViewData.ModelMetadata.AdditionalValues結果は、たとえば に渡される属性辞書に追加されますHtml.TextBox

于 2013-08-11T22:48:52.850 に答える