6

次の UIHint ベースの属性があります。

[AttributeUsage(AttributeTargets.Property)]
public class DropDownListAttribute : UIHintAttribute, IMetadataAware
{
    public DropDownListAttribute(string selectListName)
        : base(KnownUiHints.DropDown, KnownPresentationLayers.Mvc, selectListName)
    {
        SelectListName = selectListName;
    }

    public string SelectListName { get; set; }

    public void OnMetadataCreated(ModelMetadata metadata)
    {
        metadata.AdditionalValues[KnowMetadataKeys.SelectListName] = SelectListName;
    }
}

その目的は、次のように、リストから選択される単一値ビュー モデル プロパティに SelectList を割り当てることです。

public class DemoModel: ViewModel
{
    [Required]
    [DropDownList("LanguageSelect")]
    [Display(Name = "Language")]
    public int? LanguageId { get; set; }

    public SelectList LanguageSelect { get; set; }
}

私はこれをいくつかの非常にゴルベルグ的な機械と私自身のメタデータ プロバイダーで動作させていますが、 を発見したIMetadataAware.OnMetadataCreatedので、これを単純化できると感じています。現在SelectListName、メタデータに を追加してから、いくつかのフープを介して a) SelectList を一種のグローバル ディクショナリに取得し、b) ドロップダウン リストをレンダリングするときにそのディクショナリから選択リストを取得します。

SelectList 自体を属性のモデル メタデータ、つまり、属性が適用されるプロパティにローカルなメタデータに追加したいのですが、そのプロパティにアクセスするにはどうすればよいですか?

4

1 に答える 1