【问题标题】:Displaying List of options selected in MVC显示 MVC 中选择的选项列表
【发布时间】:2013-11-08 11:01:58
【问题描述】:

我正在尝试显示之前选择的选项列表。

我的模型看起来像:

 public IEnumerable<SelectListItem> ChildrenOptions { get; set; }
 public List<Guid> ChildrensId { get; set; }

在控制器中,我使用列表中的 MultiSelectList 填充 IEnumerable,并将其传递给模型

MyModel.ChildrenOptions = new MultiSelectList(myList, "Id", "Name");
return View(myModel);

所以如果我写在我的视图中

@Html.DisplayFor(modelItem => item.Children, item.ChildrenOptions)

它显示 Guid/Id,但我想显示名称列表。 如果我用 foreach 循环列表,那么我只有 Guid。

有什么想法吗?

我已经访问过一些包含有用相关信息的帖子:

【问题讨论】:

  • 很难说你想要达到什么目标:你想显示一个下拉列表吗?还是一个简单的名字列表?
  • 抱歉,Réda,我将在问题中明确说明。在列表/详细信息视图中,我需要显示名称列表。在编辑视图中,当我使用下拉列表时,它可以正常工作。

标签: c# asp.net-mvc-4 razor


【解决方案1】:

如果您只需要显示名称列表,则不需要MultiSelectList,因为您不会使用下拉列表。您只需要获取所有 ID 被选中的名称:

在你看来,在显示名字之前:

IEnumerable<string> names = item.ChildrenOptions.Where(child => item.ChildrenId.Cast<string>().Contains(child.Value)).Select(child => child.Text);

但是,最好为您的列表/详细信息视图创建另一个视图模型,将您的 MultiSelectList 替换为 IEnumerable&lt;string&gt;(或者如果您愿意,可以将此属性添加到您现有的视图模型中),以便评估您在控制器中的列表。您的视图中的噪音会更少,并且您会专注于显示您的名单:

在你的控制器中:

myOtherModel.ChildrenOptionNames = myList.Where(child => myOtherModel.ChildrenId.Contains(child.Id)).Select(child => child.Name);
return View(myOtherModel);

在你看来:

@Html.DisplayFor(model => model.ChildrenOptionNames) // It will iterate over your list and display each name

或者如果您需要应用一些特殊格式:

@for(int index = 0; index < Model.ChildrenOptionNames.Count; index++)
{
    // apply some formatting, like putting <ul> / <li>
    @Html.DisplayFor(model => model.ChildrenOptionNames[index]);
}

【讨论】:

  • 谢谢@Réda Mattar。我正在使用第二个选项并且工作正常。对我来说真正奇怪的是,现在在我拥有的模型中: - 所选 ID 列表 - 所选名称列表 - 带有所有选项(ID + 名称)的 IEnumerable。更干净,但现在模型看起来有重复数据。
  • 这是因为您对两个略有不同的视图使用相同的模型:一个需要下拉列表,另一个需要名称列表。我不知道您的视图是否有比这更多的数据,但您可以通过制作两个视图模型来重构它,一个包含选定的 id 列表 + 一个 selectlistitem 列表(编辑),一个包含名称列表(列表/细节)。如果它们之间有一些其他数据是通用的,您还可以创建一个包含共享属性的基类。
  • 在这种情况下,我会将模型的数量增加三倍,因为每个实体都有一个基本模型,另一个用于编辑器视图,另一个用于显示视图。看起来很干净,很有结构,但真的很大!谢谢你的时间。
  • 它看起来很大,但您不必担心:构建所有这些需要一些努力,但是当您的设计清晰时,您可以节省大量维护应用程序的时间。
猜你喜欢
  • 1970-01-01
  • 2014-06-20
  • 2012-10-15
  • 1970-01-01
  • 2021-01-14
  • 2010-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多