1

selectedValuesASP.NET MVC (Razor) プロジェクトで、編集ビューで複数選択オプション付きの ListBox を使用しています。 in を使用して以前に選択した項目を強調表示する際に問題があったため、以前MultiSelectListSO について質問しました。その質問に対する回答によると、を使用せずにデータをビューに渡すためにViewModel(AutoMapperを使用)を使用することにしましたViewBagが、それでも同じ問題があります..selectedValuesリストで指定されたアイテムを選択しません

これは私の新しいコードです

モデル

public class Post
{
    public int Id { get; set; }
    ...
    public string Tags { get; set; }

}

public class PostEditViewModel
{
    private DocLibraryContext db = new DocLibraryContext();

    public int Id { get; set; }
    ..
    public MultiSelectList TagsList { get; set; }

}

コントローラ

public ActionResult Edit(int id)
    {

        Post post = db.Posts.Find(id);
        PostEditViewModel postEditViewModel = Mapper.Map<Post, PostEditViewModel>(post);

        var tagsQuery = from d in db.Tags
                        orderby d.Name
                        select d;
        postEditViewModel.TagsList = new MultiSelectList(tagsQuery, "Id", "Name", post.Tags.Split(','));

        return View(postEditViewModel);
    }

見る

<div class="editor-field">
    @Html.ListBoxFor(model => model.Tags, Model.TagsList as MultiSelectList)
</div>

ここで何が間違っていますか?助けてください....


更新 1:

コントローラーを

public ActionResult Edit(int id)
    {

        Post post = db.Posts.Find(id);
        PostEditViewModel postEditViewModel = Mapper.Map<Post, PostEditViewModel>(post);

        var tagsQuery = from d in db.Tags
                        orderby d.Name
                        select d;

        var selectedIds = post.Tags.Split(',').Select(n => tagsQuery.First(t => t.Name == n));
        postEditViewModel.TagsList = new MultiSelectList(tagsQuery, "Id", "Name", selectedIds);

        return View(postEditViewModel);
    }

しかし、私は同じ結果を得ます。


更新 2:

(このチュートリアルのように) コードを変更してみましたが、うまくいきましたが、以前の方法を使用する必要があります..

モデル

    public Post Post { get; set; }
    public MultiSelectList TagsList { get; set; }

    public PostEditViewModel(Post post)
    {
        Post = post;
        var tagsQuery = from d in db.Tags
                        orderby d.Name
                        select d;
        TagsList = new MultiSelectList(tagsQuery, "Name", "Name", post.Tags.Split(','));
    }

コントローラ

public ActionResult Edit(int id)
    {

        Post post = db.Posts.Find(id);
        return View(new PostEditViewModel(post));
    }

見る

<div class="editor-field">
    @Html.ListBox("Tags", Model.TagsList as MultiSelectList)
</div>

違いは何ですか...??

4

2 に答える 2

1

問題はあなたの構築にありますMultiSelectList

new MultiSelectList(tagsQuery, "Id", "Name", post.Tags.Split(','));

要素の値が各タグのIdプロパティから取得されるように指定していますが、実際に選択された値については、おそらくNameタグの s に対応する文字列の配列を渡しています。Name表示テキストを決定するプロパティとして指定することも重要ではありません。パラメータはselectedValues、表示テキストではなく、値と照合します。

これを修正するには、各タグ名を対応する に射影しIdます。

var selectedIds = post.Tags.Split(',').Select(n => tagsQuery.First(t => t.Name == n).Id);
new MultiSelectList(tagsQuery, "Id", "Name", selectedIds);

アップデート:

おっと、上記のコードに誤りがありました。

.Id初期化の最後に必須を追加するように回答を編集しましたselectedIds-以前のバージョンでは、IDではなくタグを選択していました(もちろん、それらは等しくないリンゴとオレンジを比較していました)。

于 2012-06-22T07:46:37.210 に答える