2011-11-01 9 views
5

私は知っていることを知っています。ListBoxは私のビューモデルをバインドしていません

herehere

しかし、私はまだ問題を把握することはできません。

私は自分自身にMVCフレームワークを教えるブログを開発しています。今私が下のビューを投稿すると、ListBoxForヘルパーは私のモデルに値をバインドしません。リストにはすべてのカテゴリが正常に含まれますが、POSTコントローラがビューモデルを取得すると、Categoriesオブジェクトはnullになります。ここで

は、ビューモデルです:

public class PostViewModel 
{ 
    public Post Posts { get; set; } 
    public IEnumerable<Category> Categories { get; set; } 
} 

コントローラー:

public ActionResult Create() 
    { 
     PostViewModel post = new PostViewModel(); 
     post.Categories = db.ListCategories(); 
     return View(post); 
    } 

ビュー:

<p>@Html.ListBoxFor(model => model.Categories, new MultiSelectList(Model.Categories, "CategoryID", "CategoryName"))</p> 
+0

POSTアクションで、またはPOSTアクション後に同じビューをレンダリングしようとすると、null値が返されますか? – epzee

答えて

9

私はあなたのビューモデルに配列プロパティを持つべきであると信じています選択したIDがバインドされます。

public class PostViewModel 
{ 
    public Post Posts { get; set; } 
    public int[] SelectedCategoryIds { get; set; } 
    public IEnumerable<Category> Categories { get; set; } 
} 

そしてSelectedCategoryIdsプロパティであるためにあなたのHtml.ListBoxFor呼び出しを変更します。今、あなたはあなたがリストのラベルを持っている場合は、あまりにもSelectedCategoryIdsプロパティのように、これを変更する必要があり、SelectedCategoryIdsプロパティのリストボックスを作成していること:余談として

<p>@Html.ListBoxFor(model => model.SelectedCategoryIds, new MultiSelectList(Model.Categories, "CategoryID", "CategoryName"))</p> 

@Html.LabelFor(model => model.SelectedCategoryIds, "Categories") 

"Categories"は、ラベルのテキストです)

+0

+1これは本当に私にビューモデルの概念のいくつかを手助けしました – PhilPursglove

+0

@fsmmu PostViewModelはドメインモデルであるカテゴリリストをラップしてはいけません。 – Elisabeth

2

ない私はあなたの質問を理解している場合は100%を確認してください。このコードは役に立ちますか?フォームをサーバーにポストバックするときに選択されたカテゴリを取得する方法を示します。

[HttpPost] 
public ActionResult Create(Post post, FormCollection formCollection) 
{ 
    var listOfCategoryIDs = formCollection["categories"]; 
    var arrayOfCategoryIDs = listOfCategoryIDs.Split(','); 
} 
関連する問題