0

GetStates と呼ばれるリストを返すメソッドを公開するサービス層があります。

public List<StateObject> GetStates()

私の状態オブジェクトは、私が作成した単なるカスタム オブジェクトです。

public class StateObject
{
    public int stateId { get; set; }
    public string description { get; set; }
    public Boolean isDefault { get; set; }
}

私のモデルでは、タスクの表示および変更画面に使用されるモデルを作成しようとしています。これを使用する目的の 1 つは、ドロップダウン ボックスの表示と選択を処理することです。これにより、タスクで使用可能な状態のリストが表示されます。したがって、私のモデルは次のようになります (気にしないプロパティを削除しました - これより少し大きいです:

public class TaskModifyModel
{
    public int stateId { get; set; }
    public string state { get; set; }

    public SelectList states { get; private set; }

    public TaskModifyModel()
    {

        states = new SelectList(
            (new ReferenceService().GetStates()),
            "stateId",
            "description",
            1);

    }
}

したがって、stateId は選択された状態を保持し、state は選択された状態のテキスト説明を保持します。コンストラクターで、ビューの状態 SelectList を作成しようとしています...そしてそれを設定します。

ビューで、ドロップダウン リストを表示しようとします。

@Html.DropDownListFor(m=>m.stateId, new SelectList(Model.states, "stateId", "description", Model.priorityId))

これは失敗しています。

DataBinding: 'System.Web.Mvc.SelectListItem' には、'stateId' という名前のプロパティが含まれていません。

私は検索しましたが、これを正しい方法で行っていると思っていましたが、エラーはそうではないと言っています..明らかに。:) 誰かがそれが機能しない理由を教えてくれますか?また、これは正しい方法ですか?

編集: 以下の支援の後、現在は機能しています。新しいタスク (taskId==0) を作成している場合は、データベースに保存されているドロップダウンのデフォルト値を取得する必要があります..だから、これはきれいですか? これは、オブジェクトの私の作業コンストラクターです。

public TaskModifyModel() { var referenceService = new ReferenceService(); var p = referenceService.GetPriorities(); var s = referenceService.GetStates();

    var defaultP = (from a in p where a.isDefault select a).FirstOrDefault();
    var defaultS = (from a in s where a.isDefault select a).FirstOrDefault();

    priorities = new SelectList(
        (p),
        "priorityId",
        "description"
        );
    priorityId = taskId == 0 ? defaultP.priorityId : priorityId;

    states = new SelectList(
        s,
        "stateId",
        "description");
    stateId = taskId == 0 ? defaultS.stateId : stateId;

}

大丈夫ですか?

4

1 に答える 1

2

あなたpublic SelectList states { get; private set; }はすでに SelectList であるため、ビューで再度キャストする必要はありません。

代わりにこれを試してください:

@Html.DropDownListFor(m=>m.stateId, Model.states)

ViewModel で、パラメータ「SelectedValue」を削除します。@Html.DropDownListFor は、ドロップダウンを正しい値に初期化します。

public class TaskModifyModel
{
    public int stateId { get; set; }
    public string state { get; set; }

    public SelectList states { get; private set; }

    public TaskModifyModel()
    {

        states = new SelectList(
            (new ReferenceService().GetStates()),
            "stateId",
            "description");
    }
}
于 2012-08-25T02:43:48.040 に答える