1

我有以下课程:

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确认存储在数据库中的值正在按预期进入视图。

当与之关联的属性是整数值时,我使用了 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 的集合中。

4

2 回答 2

0

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

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

于 2013-10-21T03:09:59.447 回答
0

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

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

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

于 2013-10-23T16:42:59.317 回答