【问题标题】:DropDownList how select default valueDropDownList 如何选择默认值
【发布时间】:2015-02-13 20:10:52
【问题描述】:

我在页面上有很多 DropDownLists

class BigViewModel
{
    public List<SmallViewModel> SmallVM {get;set;}
    public List<SelectListItem> Items {get;set;}
    //some other properties
}
class SmallViewModel
{
    public string ItemId {get;set;}
    //some other properties
}

<table>
    @for( var i = 0;i<Model.SmallVM.Count();i++)
    {
        <tr>
            <td>
                @Html.DropdownListFor(m=> m.SmallVM.ItemId, Model.Items)
            </td>        
        </tr>       
    }
//display other properties
</table>

在控制器中

bigViewModel.Items = List<SelectListItem>
{
    new SelectListItem{Value = "1", Text = "aaa"},
    new SelectListItem{Value = "2", Text = "bbb"},
    new SelectListItem{Value = "3", Text = "ccc"},
}
bigViewModel.SmallVM = new List<SmallViewModel>
{
    new SmallViewModel{ItemId = 3},
    new SmallViewModel{ItemId = 2},
}

在控制器中,我为每个 SmallVM 设置了不同的 ItemId,每个 DropDownList 使用相同的 Items 集合。我想为每个 DropDownList 从 SmallViewModel 设置默认值。例如在这种情况下,有两个 DropDownLists 首先应该显示默认文本“ccc”,第二个应该显示默认文本“bbb”。

我应该为每个 SmallViewModel 设置不同的 List&lt;SelectedListItem&gt; 并将它们设置为 Selected 属性还是有其他方法?

【问题讨论】:

  • 您要么对代码进行了过多的修改,要么发布的内容不足以回答这个问题。唯一存在的Items 属性是List&lt;SelectListItem&gt;,它应该是您传递给Html.DropDownListForsecond 参数。相反,您使用的是Model.Members,这里甚至没有定义它。此外,Items 中的各个项目属于 SelectListItem 类型,它没有 ItemId 属性。
  • 是的,当然是Model.Items
  • 这并没有真正添加任何东西。发布您的视图的实际模型定义以及BigViewModelSmallViewModel 类(或至少每个 属性上涉及的任何这些属性,即Members)。跨度>
  • 哦,我明白了。您也更新了问题中的代码。 Model.Items 代替 Model.Members。这解决了一个问题,但选择列表不能既是您用来生成下拉列表的东西,又是您回发到的属性,即使那样,项目仍然没有@ 987654339@ 属性,所以我什至不确定你是如何让它运行的。

标签: c# asp.net-mvc


【解决方案1】:

此行为已报告为 CodePlex 上的错误,但尚未修复。在for 循环中使用DropDownListFor() 无法正确绑定,并且无论属性值如何,始终选择第一个选项。为了使DropDownListFor() 在使用集合时正常工作,您需要为模型使用EditorTemplate

/Views/Shared/EditorTemplates/SmallViewModel.cshtml

@model SmallViewModel
@Html.DropdownListFor(m => m.ItemId, (SelectList)ViewData["Items"])

然后在主视图中

@model BigViewModel
@using(Html.BeginForm())
{
  // Pass the select list to the EditorTemplate as addtionalViewData
  @Html.EditorFor(m => m.SmallVM, new { Items = Model.Items })
  <input type="submit" />
}

您现在应该有 2 个&lt;select&gt; 控件分别显示“ccc”和“bbb”。

【讨论】:

    【解决方案2】:

    根据您的代码更新,我认为您只需将视图代码修改为:

    @Html.DropdownListFor(m=> m.SmallVM[i].ItemId, Model.Items)
    

    然而,我有一种明显的感觉,那就是XY problem,虽然这个改变会让所有东西都在帖子上连接起来,但你仍然不会得到你真正需要的东西来解决你真正的问题'正在尝试解决。

    【讨论】:

    • 对不起,我又编辑了,和你一样。我想我应该修改我的 ViewModel 并将 SelectedListitem 的集合传递给每个 SmallViewModel。
    • 您不需要选择列表项的多个副本。
    猜你喜欢
    • 2019-06-05
    • 2013-09-17
    • 2013-10-19
    • 2014-10-05
    • 2011-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多