【问题标题】:How to show multiple selected with asp.net mvc 3 and ListBoxFor?如何使用 asp.net mvc 3 和 ListBoxFor 显示多个选择?
【发布时间】:2012-01-27 21:52:59
【问题描述】:

我有这个虚拟机属性

  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/吗?

编辑2

我继续做一个例子。我一定错过了一些东西(不确定是什么)。当我使用“Darin Dimitrov”时,它可以工作。

我将示例切换到下拉列表,因为我也遇到了同样的问题。

在这个例子中,我没有使用视图模型,因为我最初的假设是不知何故,我从 Steven Sanders 那里使用的助手可能会影响它,所以我要离开他的例子。

这似乎不是这样,因为我删除了它,但仍然遇到这个问题。

  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中并尝试它制作多个下拉列表时似乎无法处理。

【问题讨论】:

标签: asp.net-mvc asp.net-mvc-3


【解决方案1】:

以下对我有用。

型号:

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" }
    )
}

结果:


更新:

现在您已经展示了一个示例来说明问题,您可以在构建SelectList 时指定所选项目:

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

未预选值的原因是因为您将下拉列表绑定到属性列表 (x =&gt; x[i].SelectedItem),而在我的示例中,我使用的是简单属性。

如果您想使用 ListBoxFor 助手执行此操作,您可以使用以下内容:

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

SelectedItems 属性成为一个集合,我们使用MultiSelectList 而不是SelectList

【讨论】:

  • 看起来和我的差不多。我想知道为什么它对我不起作用。
  • @chobo2,我不知道,我已经展示了一个工作版本。也许你想像我一样,提供一个完整的例子来说明你的问题。欢迎查看模型、控制器(带有硬编码值)和视图,以允许人们重现问题并希望能帮助您解决问题。
  • 好的,我更新了我的帖子。它实际上也发生在我的下拉列表中(所以我做了一个硬编码的例子)。
  • @chobo2,谢谢。现在你的问题更清楚了。我已经更新了我的答案,为您提供解决方案。
  • 有趣。因此,如果您只是制作一个,您可以使用简单的属性,它会解决的。但是,如果您需要像我一样的集合,那么您需要再次指定选定的列表集合,以便与它进行比较?
【解决方案2】:

主要问题是使用

@Html.DropDownListFor

而不是这个

@Html.ListBoxFor

无论你做什么,无论你的模型是什么,使用 DropDownListFor 都不会帮助你处理多个值。一旦你使用 ListBoxFor ...它就会自动工作!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-04
    • 2013-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多