0

ASP.NetでMVC3を使用していますが、私のWebアプリはViewModelとViewModelビルダーを使用して設計されています。

Builderクラスを使用して、ViewModelにいくつかのデータを入力します。私の場合、作成ビューにDropDownListがあり、このコードは正常に機能します。私の問題は、編集ビューを作成しようとすると、次のエラーが発生することです。

   {"The ViewData item that has the key 'CandidateId' is of type 'System.Int32' but must be of type 'IEnumerable<SelectListItem>'."}

私の考えでは、DropDownListに値を入力しますが、データベースレコードとして事前に選択しておきます。

では、データベースから値を選択して、編集ビューにドロップダウンリストを表示するにはどうすればよいですか?

見る

    <div class="editor-label">
        @Html.LabelFor(model => model.CandidateId)
    </div>
    <div class="editor-field">
        @Html.DropDownListFor(x => x.CandidateId, Model.CandidatesList, "None")
    </div>

モデルを見る

    public Nullable<int> CandidateId { get; set; }
    public IEnumerable<SelectListItem> CandidatesList;

モデルビルダーを見る

// We are creating the SelectListItem to be added to the ViewModel
        eventEditVM.CandidatesList = serviceCandidate.GetCandidates().Select(x => new SelectListItem
            {
                Text = x.Nominative,
                Value = x.CandidateId.ToString()
            });
4

1 に答える 1

1

このエラーの理由は、アクションでデータベースからビュー モデル[HttpPost]のプロパティを再設定するのを忘れたためです。CandidatesList

[HttpPost]
public ActionResult Edit(EventEditVM model)
{
    if (ModelState.IsValid)
    {
        // the model is valid => do some processing here and redirect
        // you don't need to repopulate the CandidatesList property in 
        // this case because we are redirecting away
        return RedirectToAction("Success");
    }

    // there was a validation error => 
    // we need to repopulate the `CandidatesList` property on the view model 
    // the same way we did in the GET action before passing this model
    // back to the view
    model.CandidatesList = serviceCandidate
        .GetCandidates()
        .Select(x => new SelectListItem
        {
            Text = x.Nominative,
            Value = x.CandidateId.ToString()
        });

    return View(model);
}

フォームを送信すると、ドロップダウン リストで選択した値のみがサーバーに送信されることを忘れないでください。コレクション プロパティは、CandidatesList値が送信されなかったため、POST コントローラー アクション内で null になります。したがって、同じビューを再表示する場合は、ビューが依存しているため、このプロパティを初期化する必要があります。

于 2012-10-09T08:51:20.723 に答える