0

そのため、MVCのイベントタイプの一般的なドロップダウンリストを取得しようとしています。

Shared /EditorTemplates/の下に部分ビューを作成しました

その内容は次のとおりです。

@model EventManager.Models.CreateEventModel

@{

    EventManager.Models.DropdownEventTypesModel dropdownList = new EventManager.Models.DropdownEventTypesModel();

    List<SelectListItem> types = dropdownList.EventTypes;

    Html.DropDownListFor(model => model.Type, types);

}

これは、この一般的なドロップダウンを使用するすべてのモデルに対して新しい部分ビューを作成する必要があり、目的を達成できないという事実を除いて、うまく機能します。C#MVCで、モデルにこのTypeプロパティがあるが、それが由来する特定のモデルを指定しないと言う方法はありますか?

@model dynamicを試しましたが、VisualStudioで次のエラーが返されました。

An expression tree may not contain a dynamic operation
4

1 に答える 1

2

必要なのは、エディターテンプレートのモデルタイプを、含まれているモデルのタイプではなく、このエディターが編集するプロパティのタイプの一部にすることです。

EventTypeクラスaとaがCreateEventModelありEditEventModel、との両方に次のようなプロパティがあるCreateEventModelとします。EditEventModelEventType

public class CreateEventModel
{
    //Other stuff here....
    public EventType TypeToCreate { get; set; }
}

public class EditEventModel
{
    //Other stuff here....
    public EventType TypeToEdit { get; set; }
}

EventType.cshtmlという名前のEditorTemplatesフォルダーにパーシャルを作成し、その中に次のようなものを配置します。

@model EventManager.Models.EventType

@{
    var types = //put whatever you need here to get the list of available types*;
}

@Html.DropDownListFor(m => m, types)

DropDownListFor()呼び出しの単純なm => m式と、ここに含まれているモデルへの参照がないことに注意してください。@model宣言の型は単にEventTypeです。エディターテンプレートが知っておく必要があるのは、EventTypeタイプのプロパティの編集に使用されることだけです。

次のように、CreateEventModelおよびのビューでこのテンプレートを使用できます。EditEventModel

ビューの作成:

@model EventManager.Models.CreateEventModel

@{
    ViewBag.Title = "Create";
}

<h2>Create</h2>

@*Other stuff here...*@

@Html.EditorFor(m => m.TypeToCreate)

ビューの編集:

@model EventManager.Models.EditEventModel

@{
    ViewBag.Title = "Edit";
}

<h2>Edit</h2>

@*Other stuff here...*@

@Html.EditorFor(m => m.TypeToEdit)

(*これに使用するコード:

EventManager.Models.DropdownEventTypesModel dropdownList = new EventManager.Models.DropdownEventTypesModel();

List<SelectListItem> types = dropdownList.EventTypes;

実際にはビューに属していませんが、それは別の問題です。)

于 2012-05-06T16:51:07.883 に答える