3

オブジェクトのプロパティを編集するための非常に単純なフォームを作成しています。プロパティの 1 つはそれに関連付けられている他のオブジェクトのリストであるため、2 つのリスト システムを使用しています。左側には現在関連付けられているオブジェクトのリスト、右側には使用可能なオブジェクトのリストがあります。たす; その下にある [追加] ボタンと [削除] ボタンは、関連する操作を関連するリスト内の強調表示された項目に適用します。十分に単純です。

1 つのことを除いて、すべて正常に動作してSelected = falseいます。リストに入力する項目を作成するときに具体的に設定した場合でも、ページが読み込まれると、両方のリストのすべての項目が選択されます。これは、ユーザーがリストに触れずにフォームを送信すると、「現在の」リストのすべてが削除され、「利用可能な」リストのすべてが追加されることを意味します。それらは複数選択リストボックスであるため、ユーザーが選択できるダミーのオプションがないため、この問題により、常に現在のアイテムの少なくとも 1 つを削除し、使用可能なアイテムの少なくとも 1 つを追加する必要があります。ダミーのアイテムがあったとしても、ユーザーはそれを選択する必要があり、忘れるとリストがめちゃくちゃになります。

[追加するために編集:]

コントローラ メソッドの実行例:

[HttpGet]
public ActionResult EditForm(int objectId)
{
    MyObject objectToEdit = _objectStore.GetObject(objectId);

    ObjectEditViewModel viewModel = new ObjectEditViewModel();
    viewModel.Object = objectToEdit;
    viewModel.AssociatedItemSelectList = objectToEdit.AssociatedItems.Select(o => new SelectListItem { Text = o.Name, Value = o.Id, Selected = false });
    viewModel.AvailableItemSelectList = _itemStore.GetAllItems().Where(o => !objectToEdit.AssociatedItems.Contains(o))
                                            .Select(o => new SelectListItem { Text = o.Name, Value = o.Id, Selected = false });

    return View(viewModel);
}

...そしてビューはただ持っています

@Html.ListBoxFor(m => m.ItemsToAdd, Model.AvailableItemSelectList)

@Html.ListBoxFor(m => m.ItemsToRemove, Model.AssociatedItemSelectList)

関連する場所で。ページが読み込まれると、選択リストボックスのすべてのオプションは次の形式になります。

<option selected="selected" value="281">Example Item</option>

リストの作成とページのレンダリングの間でアイテムがどのように選択されているか? どうすれば止められますか?または、それに失敗した場合、ページの読み込み時にすぐに選択を解除して、ユーザーが選択されていないように見えるようにするにはどうすればよいですか? ページを本来あるべきように見せるための修正がありますが、この問題の根本を突き止めたいと思います。

4

3 に答える 3

1

私は同じ問題を抱えていて、選択したアイテムをすべてに設定しているのはモデル プロパティにあることに気付きました。モデルを見ずに何が起こっているのかを知るのは難しいですが、ItemsToAddAvailableItemSelectListの定義を確認し、それぞれ他のリストを確認し、そこで .Select...ToList() を実行していないことを確認してください。

public List<SelectListItem> AvailableItemSelectList{
get
{
    var items = //get your items from repository
    return items;
}
}

public List<string> ItemsToAdd{
get{ //make sure you are not setting anything here}
set{} 
}
于 2015-08-05T18:57:47.850 に答える
1

これは返信が遅いかもしれませんが、その理由は、リストボックスが参照しているオブジェクトへのバインドに関係していると思います。たとえば、ListBoxFor の代わりに ListBox を使用し、ListBox に名前を付けて何もバインドしない場合、リストボックス内の項目は最初は選択されません。ただし、バインドされるような名前を付けると、項目が選択されます。私はあなたと同じ問題を抱えていて、たまたま試行錯誤の末にこれに出くわしました:-)

于 2013-12-17T15:36:41.023 に答える
0

ページの読み込み時にすべてのリストボックス項目の選択を解除するには、次のようにすることもできます。

$(document).ready(function () {        

   $("#listbox").find("option").attr("selected", false);

});
于 2013-01-09T10:46:29.027 に答える