11

MVC 2 の HtmlHelper EditorFor() の追加により、特定の Model オブジェクトに対して厳密に型指定された Display および Editor テンプレートを作成することはできません。それをいじった後、失うことなく追加の Model データをエディターに渡す方法について少し困惑しています。エディター コントロールの強い型付け。

古典的な例: 製品にはカテゴリがあります。ProductEditor には、すべてのカテゴリの名前を含むカテゴリの DropDownList があります。ProductEditor は Product に強く型付けされており、Product だけでなく、Categories の SelectList も渡す必要があります。

標準ビューでは、Model データを新しい型でラップして渡します。EditorTemplate では、複数のオブジェクトを含む混合モデルを渡すと、標準機能の一部が失われます (最初に気付いたのは、LabelFor/TextBoxFor メソッドのすべてが、単なる「Object」ではなく「Model.Object」のようなエンティティ名を生成していたことです。 」)。

私はそれを間違っていますか、それとも Html.EditorFor() に ViewDataDictionary/Model パラメータを追加する必要がありますか?

4

3 に答える 3

13

両方のプロパティを持つカスタム ViewModel を作成するか、ViewData を使用してその情報を渡す必要があります。

于 2009-08-08T05:17:45.253 に答える
5

私はまだ学んでいますが、解決策を考え出した同様の問題がありました。私のカテゴリは列挙型であり、列挙型を調べて Select タグの内容を決定するテンプレート コントロールを使用します。

ビューでは次のように使用されます。

<%= Html.DropDownList
            (
            "CategoryCode",
            MvcApplication1.Utility.EditorTemplates.SelectListForEnum(typeof(WebSite.ViewData.Episode.Procedure.Category), selectedItem)
            ) %>

カテゴリの列挙型は、選択項目のテキスト値として使用される説明属性で装飾されています。

 public enum Category 
        {
            [Description("Operative")]
            Operative=1,
            [Description("Non Operative")]
            NonOperative=2,
            [Description("Therapeutic")]
            Therapeutic=3 
        }
        private Category _CategoryCode; 
        public Category CategoryCode 
        {
            get { return _CategoryCode; }
            set { _CategoryCode = value; }
        }

SelectListForEnum は、次のように、列挙型定義と現在選択されている項目のインデックスを使用して、選択項目のリストを作成します。

        public static SelectListItem[] SelectListForEnum(System.Type typeOfEnum, int selectedItem)
    {
        var enumValues = typeOfEnum.GetEnumValues();
        var enumNames = typeOfEnum.GetEnumNames();
        var count = enumNames.Length;
        var enumDescriptions = new string[count];
        int i = 0;
        foreach (var item in enumValues) 
        {
            var name = enumNames[i].Trim();
            var fieldInfo = item.GetType().GetField(name);
            var attributes = (DescriptionAttribute[])fieldInfo.GetCustomAttributes(typeof(DescriptionAttribute), false);
            enumDescriptions[i] = (attributes.Length > 0) ? attributes[0].Description : name;
            i++;
        }
        var list = new SelectListItem[count];
        for (int index = 0; index < list.Length; index++)
        {
            list[index] = new SelectListItem { Value = enumNames[index], Text = enumDescriptions[index], Selected = (index == (selectedItem - 1)) };
        }
        return list;
    }

最終結果は、適切に提示された DDL です。

お役に立てれば。これを行うためのより良い方法についてのコメントは大歓迎です。

于 2009-12-14T08:38:55.253 に答える
4

クラスの注釈がすべて含まれている ViewData.ModelMetadata を使用してみてください。

優れた記事http://bradwilson.typepad.com/blog/2009/10/aspnet-mvc-2-templates-part-4-custom-object-templates.html

于 2009-12-30T18:51:40.207 に答える