MVC4 Html.DropDownListFor未选择指定的值

时间:2013-10-21 02:34:31

标签: asp.net-mvc-4 html.dropdownlistfor selectedvalue

我有以下课程:

public class PreviewImage_Edit
{
    ...
    public List<GridDetail_Edit> GridDetails { get; set; }
    public SelectList GridDetailTypesList { get; set; }
    ...
}

public class GridDetail_Edit
{
    ...
    public int GridDetailTypeId { get; set; }
    ...
}

而且,我有一个部分视图,需要一个类型为PreviewImage_Edit的模型,它具有以下代码块:

@model PreviewImage_Edit
...
@if (Model.GridDetails != null)
{
    for (var i = 0; i < Model.GridDetails.Count(); i++)
    {
        ...
        @Html.DropDownListFor(model => model.GridDetails[i].GridDetailTypeId, Model.GridDetailTypesList)
        ...
    }
}

我正在GridDetail_Edit中正确创建SelectList,下拉列表按预期填充。下面是为第一个GridDetails对象生成的标记:

<select data-val="true" data-val-number="The field GridDetailTypeId must be a number." data-val-required="The GridDetailTypeId field is required." id="GridDetails_0__GridDetailTypeId" name="GridDetails[0].GridDetailTypeId">
    <option value="1">Top</option>
    <option value="2">Bottom</option>
</select>

单击“保存”按钮后,我已验证所选选项是否已正确保存在数据库中(即使所选选项不是下拉列表中的第一个/默认选项)。但是,当我返回重新编辑时,所选选项仍然是下拉列表中的第一个选项。

我逐步完成代码并验证数据是否已从数据库中正确检索。我甚至将 Html.DropDownListFor 转换为 Html.EditorFor ,并确认存储在数据库中的值正如预期的那样进入视图。 / p>

我使用了 Html.DropDownListFor ,当与之关联的属性是一个整数值时,但从来没有它是一个整数值,它是对象集合的一部分。我会担心到目前为止我所做的事情,但是所有事情似乎都在解决这个关键问题。

到目前为止,我已经尝试将PreviewImage_Edit中的SelectList移动​​到GridDetail_Edit并单独初始化它们,我已经以编程方式为相应的SelectedListItem设置了“Selected”值。那不起作用......结果相同。

有没有人遇到过这个问题?有关解决此问题的最佳方法的任何建议吗?


更新

以下是填充GridDetailTypesList

的代码片段
var gridDetailTypes = _db.GridDetailTypes.OrderBy(g => g.DisplayOrder).ToList();
return new SelectList(gridDetailTypes, "GridDetailTypeId", "Name");

这很简单。 SelectList构造函数的第二个参数表示其值应在“value”属性中使用的字段。我不相信这个问题与value字段是一个整数的事实有关,因为我在同一页面上有类似的代码,并且下拉列表运行正常。唯一的区别是我的“问题”下拉列表在我的ViewModel的集合中。

2 个答案:

答案 0 :(得分:0)

我唯一一次看到关于“必须是数字”的下拉列表中的消息,当我搞砸了,当我从数据库加载它们时,OPTION的(数字)值用空格填充。这似乎不是你的问题(你的例子特别显示没有填充)但我肯定想看看GridDetails [0] .GridDetailTypeId的值,以确保它具有正确的类型/值。

希望我能将此添加为评论而不是答案 - 但我的代表还不够高......

答案 1 :(得分:0)

它对我有用的唯一方法是当我的List是一个简单的IEnumerable<string>时,或者当我将自定义对象的相同属性传递给DataText作为DataValue时。如下:

Html.DropDownListFor(m => m.TypeOfFilter, new SelectList(Model.Filters, "DataText", "DataText")

其中TypeOfFilter是枚举,Model.Filters是List<MySelectItemModel>。 这样,您可以在生成的HTML中看到选择了正确的选项。