我的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));
答案 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
,因此defaultValue
为null
并且该方法使用您传递给视图的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()
方法。
最后请注意,这只是始终使用视图模型的另一个原因。