DropDownList不希望被设置

时间:2017-01-25 10:43:27

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

我的dropDown列表不希望有默认值!

<div class="form-group">
            @Html.LabelFor(model => model.unit, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.DropDownListFor(x => x.unit.id, selectUnit)
                @Html.ValidationMessageFor(model => model.unit.id, "", new { @class = "text-danger" })
            </div>
        </div>

显示正确的列表但未选择任何列表。

我使用ViewBag获取我的SelectList:

@{
    IEnumerable<SelectListItem> selectUnit = ViewBag.Unit;
}

当我断开cshtml时,Model.unit.id为4,selectUnit有一个项目,其中4为值。

当我这样做时

@selectUnit.Where(x => x.Value == Model.unit.id.ToString()).First().Text

选择正确的文字值!

Lats认为:这是我的单位模型:

public class Unit
{
    public int id { get; set; }
    public string name { get; set; }
    public string description { get; set; }
    public IList<Unit> children { get; set; }
}

先谢谢大家,我变得很吵了

修改

public class ModelPassedTroughTheView
{
    ...
    public Unit unit { get; set; }
}

编辑2:完整代码:

编辑页面:     @model BE.DealerGroupSAP

@{
    ViewBag.Title = Resources.Admin.DealerGroup_Edit;

    IEnumerable<SelectListItem> selectUnit = ViewBag.Unit;
}

@using (Html.BeginForm())
{
    @Html.AntiForgeryToken()

    <div class="form-horizontal">
        <h4>@ViewBag.Title</h4>
        <hr />
        @Html.ValidationSummary(true, "", new { @class = "text-danger" })
        @Html.HiddenFor(model => model.id)

        <div class="form-group">
            @Html.LabelFor(model => model.unit, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.DropDownListFor(x => x.unit.id, selectUnit)
                @Html.ValidationMessageFor(model => model.unit.id, "", new { @class = "text-danger" })
            </div>
        </div>

        <div class="form-group">
            <div class="col-md-offset-2 col-md-10">
                <input type="submit" value="@Resources.Global.Save_Edits" class="btn btn-default" />
            </div>
        </div>
    </div>
}

模型传球槽视图:

public class DealerGroupSAP
{
    public int id { get; set; }
    public Unit unit { get; set; }
}

单位对象:

public class Unit
{
    public int id { get; set; }
    public string name { get; set; }
    public string description { get; set; }
    public IList<Unit> children { get; set; }
}

Controller的内容:

ViewBag.Unit = GetUnits();
return View(BL.AnomalyBL.GetAllSAPResponsible(id));

1 个答案:

答案 0 :(得分:2)

问题是您的模型有一个名为unit的属性,并且您还将SelectList视图传递给ViewBag一个名为Unit的属性(MVC的模型绑定功能是不区分大小写。

ViewBag属性的名称更改为(比方说)

ViewBag.UnitList = GetUnits();

并在视图中

@{ IEnumerable<SelectListItem> selectUnit = ViewBag.UnitList }

将选择正确的选项。

解释内部发生的事情:

DropDownListFor()方法首先检查defaultValue中的值(在您的情况下不存在),然后检查ModelState,从而确定ViewData(所选项目)。由于ViewData包含Unit的键/值对,IEnumerable<SelectListItem>且不包含属性id,因此defaultValuenull并且该方法使用您传递给视图的IEnumerable<SelectListItem>来构建<option>元素,其中没有一个元素具有Selected = true值,因此选择第一个选项是因为必须要有。< / p>

ViewBag属性更改为(比方说)UnitList表示该方法在unit中找不到ViewData的匹配键,现在检查unit.id的模型1}},存在,并设置defaultValue = 4。由于defaultValue不是null,因此会在内部生成新的IEnumerable<SelectListItem>,并且相应的SelectListItem将其Selected属性设置为true。< / p>

要了解这一切的详细信息,您可以检查SelectExtensions的源代码 - 尤其是private static MvcHtmlString SelectInternal()方法。

最后请注意,这只是始终使用视图模型的另一个原因。