私はMVC3 Webアプリケーションに取り組んでいます。アプリケーション管理システムからBLOを編集するときに表示されるカテゴリのリストが必要です。私のビューモデルでは、カテゴリのselectlistitemsのリストに対して次のプロパティが定義されています。
/// <summary>
/// The List of categories
/// </summary>
[Display(Name = "Categorie")]
public IEnumerable<SelectListItem> Categories { get; set; }
次のステップであるコントローラーには、データベースからselectlistitemsのリストが書き込まれる次の編集アクションが含まれています。
public ActionResult Edit(Guid id)
{
var blogToEdit = _blogService.First(x => x.Id.Equals(id));
var listOfCategories = _categorieService.GetAll();
var selectList = listOfCategories.Select(x =>new SelectListItem{Text = x.Name, Value = x.Id.ToString(), Selected = x.Id.Equals(blogToEdit.Category.Id)}).ToList();
selectList.Insert(0, new SelectListItem{Text = Messages.SelectAnItem, Value = Messages.SelectAnItem});
var viewModel = new BlogModel
{
BlogId = blogToEdit.Id,
Active = blogToEdit.Actief,
Content = blogToEdit.Text,
Title = blogToEdit.Titel,
Categories = selectList //at this point i see the expected item being selected
//Categories = new IEnumerable<SelectListItem>(listOfCategories, "Id", "Naam", blogToEdit.CategorieId)
};
return View(viewModel);
}
ビューが返される直前にブレークポイントを設定すると、期待どおりに選択リストがいっぱいになります。そのため、この時点ではすべてが問題ないようです。ビューモデルは完全に正確に満たされています。それから私のビューでは(私はRazorを使用しています)、選択リストをレンダリングすることになっている次の2つのルールがあります。
@Html.LabelFor(m => m.Categories) @Html.DropDownListFor(model=>model.Categories, Model.Categories, Model.CategoryId)
@Html.ValidationMessageFor(m => m.Categories)
コードを実行し、ビューを開いてブログを編集すると、すべての正しいデータを見ることができます。また、選択リストは正しくレンダリングされますが、選択したいアイテムは選択を失います。どうすればいいの?ビューモデルがビューで返されるまで、すべては問題ありません。しかし、ブラウザでWebページを表示すると、選択リストは正しい選択なしでしか表示されません。ここに何が欠けていますか?それとも間違っていますか?
@Html.DropDownListFor(model=>model.Categories, Model.Categories, Model.CategoryId)
ここでは、ヘルパーメソッドを適切に使用していません。最初の引数は、現在選択されている値を含むビューモデルのプロパティである必要があります。コレクションではなく、スカラープロパティである必要があります。
したがって、ビューモデルでは、このようなプロパティを追加する必要があります。
[Display(Name = "Categorie")]
public IEnumerable<SelectListItem> Categories { get; set; }
public string SelectedValue { get; set; }
そして、コントローラーアクションで:
var selectList = listOfCategories.Select(x => new SelectListItem {
Text = x.Name,
Value = x.Id.ToString()
}).ToList();
var viewModel = new BlogModel
{
BlogId = blogToEdit.Id,
Active = blogToEdit.Actief,
Content = blogToEdit.Text,
Title = blogToEdit.Titel,
Categories = selectList,
// this is what sets the selected value
SelectedValue = blogToEdit.Category.Id
};
そして、あなたの意見では単純に:
@Html.DropDownListFor(x => x.SelectedValue, Model.Categories)
以前に選択リスト項目のselected = trueプロパティを使用して効果があったと確信しています。私が抱えていた問題の1つは、ViewDataの競合する値でした。