【问题标题】:@Html.DropDownList fails on Selected = true@Html.DropDownList 在 Selected = true 上失败
【发布时间】:2013-12-13 12:27:23
【问题描述】:

@Html.DropDownList 似乎无法在设置了 Selected 值的情况下呈现。我有一个例子:

@foreach (SelectListItem item in ViewBag.Agare as List<SelectListItem>)
{
    <div>
        Item: Name: @(item.Text) Value: @(item.Value) Selected: @(item.Selected)
    </div>
}
<div class="editor-field">
    @Html.DropDownList("Agare", ViewBag.Agare as List<SelectListItem>, new {@class = "chzn-select" })
</div>

结果是:

名称:演示游艇俱乐部价值:1 已选择:错误

姓名:Anders Jansson 值:100 已选择:False

名称:Per Kyrk 值:101 已选择:False

姓名:Oskar Persson 值:102 已选择:真

名称:Pluten Snutten 值:204 已选择:False

第一个选项总是默认值!

渲染代码为:

  <select class="chzn-select" id="Agare" name="Agare" required="required">
    <option value="1">Demo Yacht Club</option>
    <option value="100">Anders Jansson</option>
    <option value="101">Per Kyrk</option>
    <option value="102">Oskar Persson</option>
    <option value="204">Pluten Snutten</option>
 </select>

值得一提的是,我也使用 Choosen 来设置 DropDown 的样式,但我是否停止使用它也没关系。否则一切都非常简单!

我的版本是: 适用于 Web 的 Visual Studio Express 2013。 MVC 5.0.0 Asp.Net 剃须刀 3.0.0 Asp.Net Web API 5.0.0 Asp:net 网页 3.0.0 英孚 6.0.1 选择 0.12.0

有什么想法吗?

【问题讨论】:

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


    【解决方案1】:

    请尝试将 DropDownList 'Agare' 的名称更改为与 ViewBag 属性不同的名称。奇怪,我知道!

    @Html.DropDownList("SomethingElse", ViewBag.Agare as List<SelectListItem>, new {@class = "chzn-select" })
    

    【讨论】:

    • 一点也不奇怪。简而言之,如果帮助程序没有找到 ViewData 提供的具有给定键的值(在本例中为“Agare”),则它使用集合提供的 Selected 属性。否则,如果option.value == ViewData["Agare"],它将重建选择列表并将选项设置为选中。
    【解决方案2】:

    不要使用ViewBag。拥有更好的解决方案比仅仅解决问题更重要。如果您在互联网上搜索“ViewBag SelectListItem not working”,您会发现很多,这就是我建议您使用 VIewModel 的原因。

    下面是一个例子。

    视图模型

    public class SportsViewModel
    {
        public string SelectedSports { get; set; }
        public IEnumerable<SelectListItem> Sportses { get; set; } 
    }
    

    动作

    public ActionResult Sport()
    {
        var model = new SportsViewModel();
        //_sportses is a list for sports
        // get selectedSprortsId value for dropdown selected item. 
        model.Sportses = _sportses.Select(m => new SelectListItem {Value = m.Id.ToString(), Text = m.Name, Selected = m.Id == selectedSprortsId});
    
           return View(model);
    }
    

    查看

    @model SportsViewModel
    
    @foreach (var item in Model.Sportses)
    {
        <div>
            Item: Name: @(item.Text) Value: @(item.Value) Selected: @(item.Selected)
        </div>
    }
    <div class="editor-field">
        @Html.DropDownList("SelectedSports", Model.Sportses, new { @class = "chzn-select" })
    </div>
    

    更新:

    如果您无法更改为ViewModel,您可以使用SelectList,并将所有列表设置到您的ViewBag,如​​下所示:

       var SelectListItemList = (from s in _sportses
                          select new SelectListItem
                          {
                              Text = s.Name,
                              Value = s.Id.ToString(),
                          }).ToList();
    
        ViewBag.Agare = new SelectList(SelectListItemList , "Value", "Text", selectedSprortsId);
    

    那么在您看来,您仍然可以将现有代码删除“as List&lt;SelectListItem&gt;”。

    @foreach (SelectListItem item in ViewBag.Agares)
    {
        <div>
            Item: Name: @(item.Text) Value: @(item.Value) Selected: @(item.Selected)
        </div>
    }
    <div class="editor-field">
     @Html.DropDownList("Agare", ViewBag.Agare as List<SelectListItem>, new { @class = "chzn-select" })
    

    【讨论】:

    • 拥有更好的解决方案固然不错,但绝对不比拥有可行的解决方案更重要。
    • 嗨@Ant P,你只会尝试让某些东西工作,而不是考虑拥有更好的解决方案或让解决方案可维护......更好的解决方案意味着它可以工作,这就是它的原因称为解决方案,只有更好。
    • 不能!!其他代码依赖于名称 Agare,例如 LaberFor、Validation 和表单提交时使用的表单字段数据。该模型由 Database First EF 构建,并以这种方式维护,因此编辑和更改不是一种选择。在其他多个地方工作,只是不在这里!!!为什么!!
    • 嗯,你更新的代码和我用的一样!!!!我确实构建了一个 List 并将其放在 ViewBag 中,所以问题仍然存在,为什么它不起作用!
    • @Lin 不,我不会“只是尝试让某些东西发挥作用而不考虑有更好的解决方案”(并且从未说过类似的话),但您暗示优雅是 比功能更重要,这会让你留下很多非常无用的代码。也许你的措辞不正确。
    【解决方案3】:

    更改了 ViewBag 属性的名称,现在可以使用了。

    @Html.DropDownList("Agare", ViewBag.ListOfAgare as List<SelectListItem>, new { required = "required", @class = "chzn-select" })
    

    为什么会这样?

    【讨论】:

    • @Zabavsky 对我的回答的回复是否满足您的需求?
    • 不,不这么认为。最后一句话让我很困惑!永远不要使用 ViewData,只使用模型和 ViewBag 属性!
    猜你喜欢
    • 1970-01-01
    • 2012-12-30
    • 2023-04-06
    • 1970-01-01
    • 2021-04-20
    • 2010-12-16
    • 2020-03-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多