Как показать несколько выбранных с asp.net mvc 3 и ListBoxFor? - PullRequest
7 голосов
/ 02 января 2012

У меня есть свойства виртуальной машины

  public IList<Guid> SelectedEligiableCategories { get; set; }
  public IList<SelectListItem> EligiableCategories { get; set; }  

У меня есть эти помощники на мой взгляд

  @Html.LabelFor(x => x.EligibleCategoryFrmVm.SelectedEligiableCategories, "Eligible Categories:")
    @Html.ListBoxFor(x => Model.EligibleCategoryFrmVm.SelectedEligiableCategories, Model.EligibleCategoryFrmVm.EligiableCategories, new { @class = "eligibleCategoryListBox" }) 

У меня есть этот код в моем контроллере

  List<SelectListItem> eligibleCategoriesListItems = Mapper.Map<List<EligibleCategory>, List<SelectListItem>>(eligibleCategories);
  foreach (var rewardTier in creditCard.RewardTiers)
        {
            CbRewardTierFrmVm rewardTierFrmVm = new CbRewardTierFrmVm();
            rewardTierFrmVm.EligibleCategoryFrmVm.EligiableCategories = eligibleCategoriesListItems;

            foreach (var ec in rewardTier.EligibleCategories)
            {
                rewardTierFrmVm.EligibleCategoryFrmVm.SelectedEligiableCategories.Add(ec.Id);
            }

            vm.CbRewardTierFrmVm.Add(rewardTierFrmVm);
        }

Покакогда я загружаю свой взгляд.Ни одно из значений для моего ListBox не выбрано.Я не уверен почему.Если бы это был список selectList, это работало бы так, как будто бы SelectedEligiableCategories соответствовало значению в списке.

Я не уверен, что это так, потому что существует несколько выборок

Редактировать

<select name="CbRewardTierFrmVm[63b504c0-0f9a-47ba-a8ff-db85f48d5f0f].EligibleCategoryFrmVm.SelectedEligiableCategories" multiple="multiple" id="CbRewardTierFrmVm_63b504c0-0f9a-47ba-a8ff-db85f48d5f0f__EligibleCategoryFrmVm_SelectedEligiableCategories" data-val-required="Must choose at least one eligible category." data-val="true" class="eligibleCategoryListBox ui-wizard-content ui-helper-reset ui-state-default" style="display: none;">
   <option value="ed2bb5f9-4565-4f69-ab15-9fca011c0692">Gas</option>
</select>

Как вы думаете, это потому, что я использую http://blog.stevensanderson.com/2010/01/28/editing-a-variable-length-list-aspnet-mvc-2-style/?

Edit2

Я пошел впереди сделать пример.Я должен что-то упустить (не уверен, что).Когда я использую «Дарин Димитров», он работает.

Я переключил пример на выпадающий список, поскольку у меня тоже возникла та же проблема.

В этом примере я не использую модель представления, так как мое первоначальное предположение было каким-то образом вспомогательным, которое я использовал от Стивена Сандерса, возможно, влияло на него, поэтому я отказался от его примера.

Это непохоже, что это тот случай, когда я удалил его и все еще получаю эту проблему.

  public class Gift
    {
        public string Name { get; set; }
        public double Price { get; set; }
        public string SelectedItem { get; set; }
        public IList<SelectListItem> Items { get; set; }
    }


 public ActionResult Index()
    {
        List<SelectListItem> items = new List<SelectListItem>
        {

              new SelectListItem {Value = "",Text ="--"},
              new SelectListItem {Value = "1",Text ="1"},
              new SelectListItem {Value = "2",Text ="2"},
        };


        var initialData = new[] {
            new Gift { Name = "Tall Hat", Price = 39.95, Items = items, SelectedItem = "2" },
            new Gift { Name = "Long Cloak", Price = 120.00, Items = items, SelectedItem = "1"  }
         };

        return View("Index3",initialData);
    }

@model IList<EditorDemo.Models.Gift>

@{
    ViewBag.Title = "Index3";
}

@for (int i = 0; i < Model.Count; i++)
{
     @Html.DropDownListFor(x => x[i].SelectedItem, new SelectList(Model[i].Items, "Value", "Text")) 
}

Кажется, что он не справляется, когда вы кладете его в forloop и пытаетесь создать более одного выпадающего списка.

Ответы [ 2 ]

13 голосов
/ 02 января 2012

У меня работает следующее.

Модель:

public class MyViewModel
{
    public IList<Guid> SelectedEligiableCategories { get; set; }
    public IList<SelectListItem> EligiableCategories { get; set; } 
}

Контроллер:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        var model = new MyViewModel
        {
            SelectedEligiableCategories = new[]
            {
                // preselect the second and the fourth item
                new Guid("35830042-3556-11E1-BCDC-A6184924019B"),
                new Guid("4253876A-3556-11E1-BC17-B7184924019B")
            }.ToList(),

            EligiableCategories = new[]
            {
                new SelectListItem { Value = "2DA62E3A-3556-11E1-8A0A-9B184924019B", Text = "item 1" },
                new SelectListItem { Value = "35830042-3556-11E1-BCDC-A6184924019B", Text = "item 2" },
                new SelectListItem { Value = "3D07EBAC-3556-11E1-8943-B6184924019B", Text = "item 3" },
                new SelectListItem { Value = "4253876A-3556-11E1-BC17-B7184924019B", Text = "item 4" },
            }
        };
        return View(model);
    }
}

Вид:

@model MyViewModel

@using (Html.BeginForm())
{
    @Html.ListBoxFor(
        x => x.SelectedEligiableCategories, 
        Model.EligiableCategories,  
        new { @class = "eligibleCategoryListBox" }
    )
}

Результат:

enter image description here


ОБНОВЛЕНИЕ:

Теперь, когда вы показали пример, позволяющий проиллюстрировать проблему, вы можете указать выбранный элемент при построении SelectList:

@Html.DropDownListFor(
    x => x[i].SelectedItem, 
    new SelectList(Model[i].Items, "Value", "Text", Model[i].SelectedItem)
)

Причина, по которой значение не было предварительно выбрано, заключалась в том, что вы связывали раскрывающийся список со списком свойств (x => x[i].SelectedItem), тогда как в моем примере я использовал простое свойство.

И если вы хотите сделать это с помощью помощника ListBoxFor, вы можете использовать следующее:

@Html.ListBoxFor(
    x => x[i].SelectedItems, 
    new MultiSelectList(Model[i].Items, "Value", "Text", Model[i].SelectedItems)
)

Свойство SelectedItems становится коллекцией, и мы используем MultiSelectList вместо SelectList.

3 голосов
/ 27 января 2012

Основная проблема заключается в использовании

@Html.DropDownListFor

вместо этого

@Html.ListBoxFor

Использование DropDownListFor НЕ поможет вам с несколькими значениями, что бы вы ни делали, и не важно, какая у вас модель,Как только вы используете ListBoxFor ... он будет автоматически работать!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...