web-dev-qa-db-ja.com

ビューで選択された値で選択リストを使用するC#mvc 3

私は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ページを表示すると、選択リストは正しい選択なしでしか表示されません。ここに何が欠けていますか?それとも間違っていますか?

23
Rob
@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)
51
Darin Dimitrov

以前に選択リスト項目のselected = trueプロパティを使用して効果があったと確信しています。私が抱えていた問題の1つは、ViewDataの競合する値でした。

1
nick